2021.12.23

【Salesforce Field Service】ディスパッチコンソールでカスタムアクション追加

  • このエントリーをはてなブックマークに追加
  • follow us in feedly
gettyimages (23196)

こんにちは。テラスカイのニンです。

今回はSFSにてディスパッチコンソールでカスタムアクションを追加する方法をご紹介します。

ディスパッチコンソールについて

ディスパッチコンソールは作業手配者(Dispatcher)のメイン作業スペースになり、ここで作業手配からリソースの管理までいろいろ設定できます。

ディスパッチコンソール

そこで標準のアクション以外は、日々の業務によって複数の場所でカスタムアクションを追加できます。

カスタムアクション追加できる箇所

①Gantt
ガントチャート上のサービス予定を右クリックで確認できます。

② Service List
サービス予定リスト一覧にあるサービス予定をクリックして確認できます。

③Mass Action
複数サービス予定に対する処理を、サービス予定リスト一覧上のボタン一覧から確認できます。

④ Map
マップ上のポリゴンにて右クリックで確認できます。

⑤ Resource
ガントチャート上リソース名の右側にある詳細アイコンをクリックして確認できます。

⑥ Non-Availabilities
レコードタイプが「Non Availability」のリソースの不在レコードにて右クリックで確認できます。

⑦ Break
レコードタイプが「Break」のリソースの不在レコードにて右クリックで確認できます。

カスタムアクションを追加する方法

カスタムアクション追加できる箇所確認できましたので追加する方法を確認してみましょう。
カスタムアクション追加するにはまず「Field Service 管理」アプリケーションへ遷移し、「Field Service 設定」タブを選択します。
サイトバーから「ディスパッチャコンソール UI」をクリックして「カスタムアクション」タブをクリックします。

アクションカテゴリーから表示したい箇所を選択し、「New Action」ボタンをクリックし追加できます。

Apex処理とVisualForceページどちらを選択して処理定義できます。アクションへのアクセス権についてはカスタム権限で制限できます。

Apex処理の実装例については下記リンクで参照してください。
では、これからVisualForceの実装例についてご紹介します。
ディスパッチコンソールから一括でサービステリトリを更新するアクションを追加します。
サービス予定のアクションですので渡されたパラメータはId(サービス予定Id、複数の場合、IDはカンマ区切り,パラメータ名は「services」)、Start(ガントチャートの開始日)、End(ガントチャートの終了日)になります。サービスリソース、リソースの不在アクションから渡されるパラメータ詳細については上記リンクから参照できます。
渡されたパラメータからサービス予定Idを元にサービス予定リスト一覧を取得し、テリトリを更新する処理を下記通り実際しました。
<apex:page controller="ChangeTerritoryController" lightningStylesheets="true" action="{!init}" showHeader="false" applyHtmlTag="true" applyBodyTag="false">
    <head>
        <apex:slds />
    </head>
    <body class="slds-scope" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <apex:form >
            <apex:pageMessages /> 
            <fieldset class="slds-form-element slds-form-element_compound slds-form-element_address">
                <div class="slds-form-element__control">
                    <div class="slds-form-element__row">
                        <apex:outputLabel value="選択したサービス予定:" />
                        <apex:outputLabel value="{!saNamesDisp}" /> 
                    </div>
                    <div class="slds-form-element__row">
                        <div class="slds-size_4-of-6">
                            <div class="slds-form-element">
                                <apex:outputLabel value="サービステリトリを選択" /> 
                                <div class="slds-select_container">
                                    <apex:selectList styleClass="slds-select" value="{!selectedST}" size="1"  >
                                        <apex:selectOptions value="{!stOption}" />
                                    </apex:selectList>
                                </div>
                            </div>
                        </div>
                        <div class="slds-size_2-of-6">
                            <div class="slds-form-element">
                                <apex:CommandButton styleClass="slds-button slds-button_neutral" value="割り当て" action="{!action}"/>
                            </div>
                        </div>
                    </div>
                </div>
            </fieldset>
        </apex:form>
    </body>
</apex:page>
ChangeServiceAppointmentTerritory.vfp
public class ChangeTerritoryController {
    public List<SelectOption> stOption{set;}
    public List<ServiceTerritory> stList {get;set;}
    public String saNamesDisp {get;set;}
    public String selectedst{get;set;}
    public List<Id> serviceAppointmentsIds;
    public List<ServiceAppointment> saList;
    
    public List<SelectOption> getStOption () {
        List<SelectOption> options = new List<SelectOption>();
        stList = [Select Id,Name From ServiceTerritory];
        for(ServiceTerritory st : stList) {
            options.add(new SelectOption(st.Id,st.Name));
        }
        return options;
    }
    
    public void init() {
        String serviceAppointmentsIdParam = ApexPages.currentPage().getParameters().get('services');
        System.debug(serviceAppointmentsIdParam);
        if(serviceAppointmentsIdParam == '') {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, 'テリトリ変更を行うサービス予定が選択されていません。' ));
        }
        
        serviceAppointmentsIds = serviceAppointmentsIdParam.split(',');
        saList = [SELECT FSL__InJeopardy__c, AppointmentNumber,ParentRecordId,status FROM ServiceAppointment WHERE Id in : serviceAppointmentsIds];
        
        
        List<String> saNames = new List<String>();
        for (ServiceAppointment s : saList) {
            saNames.add(s.AppointmentNumber);
        }
        system.debug(saNames);
        saNamesDisp = String.join(saNames, ', ');
    }
    
    public pagereference action() {
        List<WorkOrder> woList = new List<WorkOrder>();
 
        for (ServiceAppointment s : saList) {
            WorkOrder wo = new WorkOrder();
            wo.Id = s.ParentRecordId;
            wo.ServiceTerritoryId = selectedst;
            woList.add(wo);
        }
       
        try{
            upsert woList;
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.CONFIRM, saNamesDisp + 'のテリトリ変更処理が正常に終了しました。'));
        } catch(DmlException e) {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, 'テリトリの更新処理に失敗しました。' + e.getMessage()));
        }
        return null;
    }

}
ChangeTerritoryController.apxc
VisualForceページ作成後、下記通りカスタムアクションを追加します。

Salesforce Field Service Custom Action

最後に

以上ディスパッチコンソールのカスタムアクションについてご紹介してきましたが、いかがでしたでしょうか。
カスタムアクションを活用した業務のカスタマイズにより、手配者の作業効率が向上できるのではないかと思います。
最後までお読みいただきまして、ありがとうございました。
37 件
     
  • mitocoで解決!Salesforceでつまずく5つのハードルの乗り越え方
  • Salesforceの保守運用をプロ人材が常駐サポート

関連する記事