クオータおよびキャパシティ管理による予約における動的な移動最適化

25C更新以降、getBookingOptionsおよびshowBookingGrid API操作では、25A更新のfindMatchingResources API操作で導入されたものと同じ拡張動的移動最適化機能がサポートされます。 この機能改善により、Orcle Fusion Field Serviceの機能が大幅に改善され、予測アクティビティ需要と移動の最小化のバランスをとることによって、スケジューリングが動的に最適化されるため、移動効率の向上、運用コストの削減、および顧客満足度の向上につながります。

移動対応の最適化が、予約プロセスの初期段階への即時リソース照合を超えて拡張されました。 これにより、アプリケーションは、新しいアポイントメントを既存のスケジュールまたは近隣地域の予想される需要パターンと連携させることで、不要な移動をインテリジェントに削減する予約オプションを提案できます。

たとえば、人口密度の高い都市部で事業を展開しているフィールド・サービス組織を考えてみます。 更新されたAPI操作では、すでに近くに計画されている他のアクティビティと一致するアポイントメント・スロット、または履歴トレンドと予測需要に基づいてクラスタ化された予約を引き付ける可能性が高いアポイントメント・スロットを提案できるようになりました。 たとえば、フィールド・リソースが指定日の特定の地域ですでにスケジュール済タスクがある場合、アプリケーションは、複数の日にわたってアポイントメントを分散するのではなく、同じ時間枠内にその領域でアポイントメントの予約に優先順位を付けることができます。 これにより、ルートの統合、フィールド・リソースの移動疲労の軽減、タイムリなサービス提供が保証されます。

季節的なメンテナンス・サイクルなど、需要の高い期間中は、showBookingGrid API操作のトラベル対応機能により、ディスパッチャは、容量だけでなく移動効率の面でも最適なタイム・スロットを識別できます。 これにより、作業のよりインテリジェントな配分が可能になり、フィールド・チームが集中的な地理的ゾーン内で1日当たりにより多くのアポイントメントに対処できるようになります。

更新済UIパラメータ

「割当」構成ページの「予約」セクションで、選択した予約方法に関係なく、次のパラメータを構成できるようになりました:

  • 最適化目標: デフォルト(早期スケジュール)または移動の最適化のいずれかを選択します。
  • 予約時に予測アクティビティを使用: 予約時に予測アクティビティ・フローを考慮するオプションです。
  • 次の日数範囲内のアクティビティ・フローを予測: 予測範囲を日数で定義します(0から31までの最小値と最大値)。
    • 範囲より前の日付の場合、予約に近いアクティビティがすでに含まれているルートのみが推奨されます。
    • 範囲内の日付の場合、アクティビティ・フロー予測は、提案されたルートの追加移動がバケットごとの平均に近い方法で適用されます。
    • 範囲終了後の日付については、実行可能なすべてのルート位置が返されます。

UIまたはAPIを使用して「予約時に予測アクティビティを使用」を有効にすると、アプリケーションは、定義された予測範囲に関連する記帳日に基づいてスケジューリング・ロジックを調整します:

  • 予測範囲の前: 既存のアクティビティに隣接するルート・オプション、または最小限の追加移動(バケットごとの平均移動の120%未満)のみ返されます。
  • 予測範囲内: オプションは、予測アクティビティ密度、移動キー近接度および統計移動推定に基づいて選択されます。 使用可能な予測データがない場合は、予測範囲より前の日付と同じロジックが使用されます。つまり、予測は適用されません。
  • 予測範囲の後: 可能なすべてのルート・オプションが、標準のGetBookingOptionsまたはshowBookingGrid APIの動作を使用して返されます。

ノート: このロジックの詳細な説明および例は、この動作が最初に導入された25Aの新機能の直接割当の記帳での動的出張最適化を参照してください。 クオータおよびキャパシティ管理を考慮して記帳を実行する場合は、ここで同じロジックが再使用されます。

予約オプションの取得API操作の変更

リクエスト・パラメータの追加: 新しいオブジェクトforecastDuringBookingがリクエストに追加され、予約最適化オプションおよび予測アクティビティ・フローに基づくスケジューリングが有効になります。 新しいオブジェクトには次のフィールドが含まれます:

  • useForecastDuringBooking
  • optimizationGoal
  • minForecastRangeDay
  • maxForecastRangeDay

リクエストの例:

{
    "name": "useForecastDuringBooking",
    "in": "query",
    "type": "boolean",
    "description": "Turn on to sort and filter the results by means of forecasting the future activity flow to calculate the average additional travel per activity.",
    "required": false
},
{
    "name": "optimizationGoal",
    "in": "query",
    "type": "string",
    "enum": [
        "default",
        "minimizeAdditionalTravel"
    ],
    "description": "Choose minimizeAdditionalTravel to sort the results by increasing of additional travel added.
Default option sorts the results by ETA from minimal to maximal.",
    "required": false
},
{
    "name": "minForecastRangeDay",
    "in": "query",
    "type": "integer",
    "minimum": 0,
    "maximum": 31,
    "description": "Number of days, counted from current day, where current day is 0, before which only results that has an existing activity within the close proximity are returned.
No activity flow forecasting is done before Minimum Forecast Range Day.",
    "required": false
},
{
    "name": "maxForecastRangeDay",
    "in": "query",
    "type": "integer",
    "minimum": 0,
    "maximum": 31,
    "description": "Number of days, counted from current day, where current day is 0.
Should be greater than Minimum Forecast Range Day. Application does the activity flow forecasting between Minimum Forecast Range Day and Maximum Forecast Range Day. During this period the average additional travel is calculated based on the number of the forecasted activities within the close proximity of the activity being booked and only results having the additional travel lesser than the average per-bucket travel are returned. After the Maximum Forecast Range Day all the available results are returned, despite the additional travel. No activity flow forecasting is done after Maximum Forecast Range Day.",
    "required": false
}


































レスポンス例:

?dates=2025-02-14
&useForecastDuringBooking=true
&optimizationGoal=minimizeAdditionalTravel
&minForecastRangeDay=1
&maxForecastRangeDay=10
&determineAreaByWorkZone=true
&estimateTravelTime=true
&estimateDuration=true
&determineCategory=true
&string_text_activity_property=IN
&activityType=default_customer_activity_type
&WO_TYPE=4
&postalCode=32953
&city=Merrit%20Island&address=250%20Crockett%20Blvd
&state=FL
&latitude=28.3864047
&longitude=-80.7073004
&defaultDuration=40
&BookingStatisticProperty_1=PROP4
&BookingStatisticProperty_2=PROP5
&BookingStatisticProperty_3=PROP6
&BookingStatisticProperty_4=PROP7




















レスポンスの変更: 「予測アクティビティ・フローの使用」オプションが有効になっている場合(GUIまたはAPIパラメータを使用)、返されるスケジューリング・オプションはデフォルト設定とは異なります。 新しいオブジェクトrecommendationInfoが追加されます。

新規オブジェクトを含むgetBookingOptionsレスポンスの例:

{
    "duration": 40,
    "travelTime": 31,
    "actualAtTime": "2025-02-07 14:47:33",
    "categories": [
        "API_category1"
    ],
    "workZone": "ChristmasBKFRD",
    "timeSlotsDictionary": [
        {
            "label": "08-10",
            "name": "08-10",
            "timeFrom": "00:01:00",
            "timeTo": "23:59:00"
        },
        {
            "label": "14-18",
            "name": "14-18",
            "timeFrom": "14:00:00",
            "timeTo": "18:00:00"
        },
        {
            "label": "12-14",
            "name": "12-14",
            "timeFrom": "12:00:00",
            "timeTo": "14:00:00"
        }
    ],
    "dates": [
        {
            "date": "2025-02-14",
            "areas": [
                {
                    "label": "AreaTF",
                    "name": "AreaTF",
                    "averageBucketTravel": 31,
                    "averageTravelKeyTravel": 15,
                    "hasNearbyActivities": true,
                    "hasForecastedActivities": false,
                    "duration": 40,
                    "travelTime": 30,
                    "bucket": "AreaTF",
                    "timeZone": "Europe/Athens",
                    "timeZoneDiff": 120,
                    "timeSlots": [
                        {
                            "label": "12-14",
                            "recommendationInfo": {
                                "additionalTravel": 23,
                                "travelKeyMatch": true
                            }
                        },
                        {
                            "label": "14-18",
                            "recommendationInfo": {
                                "additionalTravel": 23,
                                "travelKeyMatch": true
                            }
                        },
                        {
                            "label": "08-10",
                            "recommendationInfo": {
                                "additionalTravel": 23,
                                "travelKeyMatch": true
                            }
                        }
                    ]
                }
            ]
        }
    ]
}






































































推奨情報: 新しいrecommendationInfoオブジェクトがgetBookingOptionsレスポンス構造に追加されました:

"recommendationInfo": {
    "type": "object",
    "description": "This structure is provided for options that are recommended by the system.",
    "properties": {
        "additionalTravel": {
            "type": "integer",
            "title": "Additional Travel",
            "description": "The difference in minutes between total travel in the current route and travel in the proposed route where the booking activity added."
        },
        "travelKeyMatch": {
            "type": "boolean",
            "title": "Travel Key Match",
            "description": "Contains one of the following values: true or false. If true, either the previous or the following activity has the same travel travel key value as the activity specified in request. If false, then the previous or the following activity has the different travel key values as the activity specified in request."
        }
    }
}

「追加出張」フィールド: 新しいadditionalTravel整数フィールドが(recommendationInfoオブジェクトの一部として)getBookingOptionsレスポンス構造に追加され、リクエストされたアクティビティが提案された位置に予約された場合に必要となる追加の移動が含まれます。

{
    "type":"object",
    "properties":{
...
        "additionalTravel":{
            "type":"integer",
            "title":"Additional Travel",
            "description":"The difference in minutes between total travel in the current route and travel in the proposed route where the booking activity added."
        },
...
    }
}

「移動キー照合」フィールド: ルート内の次のアクティビティまたは前のアクティビティが同じ移動キーに属している場合、新しいtravelKeyMatchブール・フィールドがgetBookingOptionsレスポンス構造にtrueとして追加されました。

{
    "type":"object",
    "properties":{
...
        "travelKeyMatch":{
            "type":"boolean",
            "title":"Travel Key Match",
            "description":"Contains one of the following values: true or false. If true, either the previous or the following activity has the same travel travel key value as the activity specified in request. If false, then the previous or the following activity has the different travel travel key values as the activity specified in request."
        }
    }
}

平均バケット移動: 新しいパラメータaverageBucketTravelが追加されました。 バケット内のアクティビティの平均移動時間です。

"averageBucketTravel": {
    "type": "integer",
    "title": "Average Travel Time On The Technician Bucket",
    "description": "Contains the value of average travel time over the bucket."
}

平均TravelKey旅行: 新しいパラメータaverageTravelKeyTravelが追加されました。 同じ移動キー内のアクティビティの平均移動時間です。

"averageTravelKeyTravel": {
    "type": "integer",
    "title": "Average Travel Time On The FMR Activity Travel Key",
    "description": "Contains the value of average travel time for the traveling withing the same travel key as of FMR activity."
}

付近のアクティビティあり: 新しいフラグhasNearbyActivitiesが追加されました。 予約可能アクティビティの直前または直後に配置された同じ移動キーにアクティビティがあるかどうかを示します。

"hasNearbyActivities": {
    "type": "boolean",
    "title": "Contains Nearby Activities",
    "description": "Contains one of the following values: true or false. If true, either the previous or the following activity is in close proximity of the activity specified in request. If false, then the previous or the following activity is not in close proximity of the activity specified in request."
}

予測アクティビティあり: 新しいフラグにForecastedActivitiesが追加されました。 additionalTravelパラメータの計算中に予測アクティビティが使用されたかどうかを示します。

"hasForecastedActivities": {
    "type": "boolean",
    "title": "Contains Forecasted Activities",
    "description": "Contains one of the following values: true or false. If true, the activity flow forecast was used to calculate the additional travel. If false, then only activities already present in the route were used to calculate the additional travel."
}

移動状況が長すぎます:  GUIまたはAPIパラメータを使用して「予測アクティビティ・フローの使用」オプションが有効になっている場合、返されるスケジューリング・オプションは新しいステータスtooLongTravelになります。 additionalTravel averageBucketTravelを20%以上超え、travelKeyMatchがない場合、予約オプションはステータスtooLongTravelを取得します。

予約グリッドAPI操作の変更の表示

リクエスト・パラメータの追加: 新しいオブジェクト'forecastDuringBooking'がリクエストに追加され、予約最適化オプションおよび予測アクティビティ・フローに基づくスケジューリングが有効になります。 新しいオブジェクトには次のフィールドが含まれます:

  • useForecastDuringBooking
  • optimizationGoal
  • minForecastRangeDay
  • maxForecastRangeDay

リクエストの例:

"forecastDuringBooking": {
    "type": "object",
    "title": "Forecast During Booking",
    "description": "The criteria used to sort and filter the results by means of forecasting the future activity flow to calculate the average additional travel per activity.<p>Results with travel more than an average per bucket are filtered out before the end of forecasting period.
If a particular parameter is not present or not specified in request, then the default values are applied.</p>",
    "properties": {
        "useForecastDuringBooking": {
            "title": "Enable Forecast During Booking",
            "description": "Turn on to sort and filter the results by means of forecasting the future activity flow to calculate the average additional travel per activity.",
            "type": "boolean"
        },
        "optimizationGoal": {
            "title": "Optimization Goal",
            "description": "Choose minimizeAdditionalTravel to sort the results by increasing of additional travel added.
Default option sorts the results by ETA from minimal to maximal.",
            "type": "string",
            "enum": [
                "default",
                "minimizeAdditionalTravel"
            ]
        },
        "minForecastRangeDay": {
            "title": "Minimum Forecast Range Day",
            "description": "Number of days, counted from current day, where current day is 0, before which only results that has an existing activity within the close proximity are returned.
No activity flow forecasting is done before Minimum Forecast Range Day.",
            "type": "integer",
            "minimum": 0,
            "maximum": 31
        },
        "maxForecastRangeDay": {
            "title": "Maximum Forecast Range Day",
            "description": "Number of days, counted from current day, where current day is 0.
Should be greater than Minimum Forecast Range Day. System does the activity flow forecasting between Minimum Forecast Range Day and Maximum Forecast Range Day. During this period the average additional travel is calculated based on the number of the forecasted activities within the close proximity of the activity being booked and only results having the additional travel lesser than the average per-bucket travel are returned. After the Maximum Forecast Range Day all the available results are returned, despite the additional travel. No activity flow forecasting is done after Maximum Forecast Range Day.",
            "type": "integer",
            "minimum": 0,
            "maximum": 31
        }
    }
}

































レスポンス例:

"forecastDuringBooking": {
    "useForecastDuringBooking": true,
    "optimizationGoal": "minimizeAdditionalTravel",
    "minForecastRangeDay": 1,
    "maxForecastRangeDay": 10
}




レスポンス変更

GUIパラメータまたはAPIパラメータを使用して「予測アクティビティ・フローの使用」オプションが有効になっている場合、返されるスケジューリング・オプションはデフォルト設定とは異なります。 返されるスケジュール・オプションの動作は、日付範囲によって異なり、findMatchingResources APIの場合と同じです。

新規オブジェクトを含むFMRレスポンスのItems部分の例:

{
    "duration": 57,
    "travelTime": 31,
    "actualAtTime": "2025-02-07 14:54:36",
    "workZone": "ChristmasBKFRD",
    "areas": [
        {
            "label": "AreaTF",
            "name": "AreaTF",
            "bucket": "AreaTF",
            "averageBucketTravel": 31,
            "averageTravelKeyTravel": 15,
            "timeZone": "Europe/Athens",
            "areaTimeSlots": [
                "08-10",
                "14-18",
                "12-14"
            ],
            "dates": [
                {
                    "date": "2025-02-14",
                    "hasNearbyActivities": true,
                    "hasForecastedActivities": false,
                    "timeZoneDiff": 120,
                    "timeSlots": [
                        {
                            "label": "12-14",
                            "resourceId": "AreaTF",
                            "recommendationInfo": {
                                "additionalTravel": 23,
                                "travelKeyMatch": true
                            }
                        },
                        {
                            "label": "14-18",
                            "resourceId": "AreaTF",
                            "recommendationInfo": {
                                "additionalTravel": 31,
                                "travelKeyMatch": true
                            }
                        },
                        {
                            "label": "08-10",
                            "resourceId": "AreaTF",
                            "recommendationInfo": {
                                "additionalTravel": 23,
                                "travelKeyMatch": true,
                                "level": "best",
                                "nearbyDistance": 22.048
                            }
                        }
                    ]
                }
            ]
        }
    ]
}























































推奨情報: 既存のrecommendationInfoオブジェクトは、次の2つの新しいフィールドで更新されています:

"recommendationInfo": {
                                                        "type": "object",
                                                        "description": "This structure is provided for options that are recommended by the system.",
                                                        "properties": {
                                                            "level": {
                                                                "description": "This attribute may be used in user interfaces for booking to mark the options with two levels of recommendations.",
                                                                "type": "string",
                                                                "enum": [
                                                                    "good",
                                                                    "best"
                                                                ]
                                                            },
                                                            "nearbyDistance": {
                                                                "description": "The distance in kilometers to the nearby activity (e.g. 'nearbyDistance': 12.5). This value is provided for Capacity Areas with Quota based booking.",
                                                                "type": "number"
                                                            },
                                                            "nearbyTravel": {
                                                                "description": "The estimated travel time in minutes to or from the nearby activity. This value is provided for Capacity Areas with Direct Assignment based booking.",
                                                                "type": "integer"
                                                            },
                                                            "additionalTravel": {
                                                                "type": "integer",
                                                                "title": "Additional Travel",
                                                                "description": "The difference in minutes between total travel in the current route and travel in the proposed route where the booking activity added."
                                                            },
                                                            "travelKeyMatch": {
                                                                "type": "boolean",
                                                                "title": "Travel Key Match",
                                                                "description": "Contains one of the following values: true or false. If true, either the previous or the following activity has the same travel travel key value as the activity specified in request. If false, then the previous or the following activity has the different travel travel key values as the activity specified in request."
                                                            }
                                                        }

「追加出張」フィールド: 新しいadditionalTravel整数フィールドがshowBookingGridレスポンス構造に追加され、リクエストされたアクティビティが提示された位置に予約された場合に必要となる追加の移動が含まれます。

{
    "type":"object",
    "properties":{
...
        "additionalTravel":{
            "type":"integer",
            "title":"Additional Travel",
            "description":"The difference in minutes between total travel in the current route and travel in the proposed route where the booking activity added."
        },
...
    }
}

移動キーの一致フィールド: ルート内の次のアクティビティまたは前のアクティビティが同じ移動キーに属している場合、新しいtravelKeyMatchブール・フィールドがshowBookingGridレスポンス構造にtrueとして追加されました。

{
    "type":"object",
    "properties":{
...
        "travelKeyMatch":{
            "type":"boolean",
            "title":"Travel Key Match",
            "description":"Contains one of the following values: true or false. If true, either the previous or the following activity has the same travel travel key value as the activity specified in request. If false, then the previous or the following activity has the different travel travel key values as the activity specified in request."
        }
    }
}

平均TravelKey旅行: 新しいパラメータaverageTravelKeyTravelが追加されました。 同じ移動キー内のアクティビティの平均移動時間です。

"averageTravelKeyTravel": {
    "type": "integer",
    "title": "Average Travel Time On The FMR Activity Travel Key",
    "description": "Contains the value of average travel time for the traveling withing the same travel key as of FMR activity."
}

付近のアクティビティあり: 新しいフラグhasNearbyActivitiesが追加されました。 予約可能アクティビティの直前または直後に配置された同じ移動キーにアクティビティがあるかどうかを示します。

"hasNearbyActivities": {
    "type": "boolean",
    "title": "Contains Nearby Activities",
    "description": "Contains one of the following values: true or false. If true, either the previous or the following activity is in close proximity of the activity specified in request. If false, then the previous or the following activity is not in close proximity of the activity specified in request."
}

予測アクティビティあり: 新しいフラグhasForecastedActivitiesが追加されました。 これは、additionalTravelパラメータの計算中に予測アクティビティが使用されたかどうかを示します。

"hasForecastedActivities": {
    "type": "boolean",
    "title": "Contains Forecasted Activities",
    "description": "Contains one of the following values: true or false. If true, the activity flow forecast was used to calculate the additional travel. If false, then only activities already present in the route were used to calculate the additional travel."
}

移動状況が長すぎます: 「予測アクティビティ・フローの使用」オプションが有効になっている場合(GUIまたはAPIパラメータを使用)、返されるスケジューリング・オプションのステータスがtooLongTravelになる可能性があります。 additionalTravelaverageBucketTravel20%より大きく超え、かつtravelKeyMatchがない場合、予約オプションはステータスtooLongTravelを取得します。

ビジネス上の利点

  • 予約プロセスの初期段階に旅行の最適化を導入し、予約のディシジョンをルーティング・エンジンの旅行効率の目標と一致させることで、出張関連のコストを削減します。
  • 既存のスケジュールや需要予測に基づいて近くのアポイントメントを積極的にグループ化し、ルートの確定前に不要な移動を最小限に抑えることで、フィールド・リソースの効率を向上させます。
  • リアルタイムのルーティング戦略との整合性を維持しながら、タイムリで効率的なサービス提供をサポートするよりスマートな予約オプションを実現することで、サービスの品質と応答性を向上させます。

有効化のステップ

機能を有効にする方法は2つあります - UIを介して、各APIコールおよびリクエストごとのレベルで使用されるデフォルト値として使用されます。

UIを介した有効化(すべてのAPIコールのデフォルト)

  1. アクセス割当て構成:
    • ナビゲーション・メニューから「割当て容量の構成」ページにナビゲートします。
    • ターゲット・アクティビティの技術者を含むバケットが、指定された1つ以上のキャパシティ・エリアに配置されていることを確認します。
  2. 出張最適化の有効化:
    • 「最適化目標」で「移動の最小化」を選択し、追加の移動に基づいてスケジュール・オプションをオーダーします。
  3. 予測アクティビティ・フローのアクティブ化:
    • 「予約時に予測アクティビティ・フローを使用」オプションをオンにします。
    • スライダを使用して予測範囲を調整し、アクティビティ・フローを予測する日数を指定します。 範囲内の最小日数および最大日数(0-31日)を設定します。 0は現在の日を表し、最大範囲は31日です。
  4. 構成の保存:
    • 変更を保存して、関連するすべてのAPIコールで機能が有効になっていることを確認します。

APIによる有効化(リクエスト単位レベル)

  1. APIリクエストの変更:
    • APIリクエストで、forecastDuringBooking オブジェクトの下に次のフィールドを含めます:
      • useForecastDuringBooking: true
      • optimizationGoal: minimizeAdditionalTravel
      • 0から31の範囲内の値を持つminForecastRangeDay およびmaxForecastRangeDay 
  2. 必須レスポンス・フィールドを含める:
    • schedulesToReturn コレクションに、レスポンス内の新しいフィールドを取得するためのforecastDuringBookingDetails オブジェクトが含まれていることを確認します。
    • schedulesToReturn minForecastRangeDay からmaxForecastRangeDay の範囲内の日付をカバーしていることを確認します。

ヒントと考慮事項

  • 割当および容量管理機能を備えたフィールド・サービス・サブスクリプションが必要です。
  • 業務上のニーズに基づいて、予測範囲を慎重に選択します。 より広い範囲では最適化が改善されますが、処理時間が長くなる可能性があります。
  • 緊急予約の柔軟性と出張の最小化のバランスを取り、業務の応答性を維持します。