Udostępnij za pośrednictwem


Ustaw reguły rezerwacji

Reguły rezerwacji w Field Service tworzą ostrzeżenia lub komunikaty o błędach, które użytkownicy widzą podczas tworzenia lub edytowania rekordu rezerwacji zasobu, na podstawie niestandardowych warunków. Na przykład można utworzyć regułę rezerwacji, aby ostrzec użytkownika, który będzie próbował zarezerwować zamówienie robocze dla zasobu na tablicy harmonogramu, który nie ma umiejętności wymaganych dla tego zadania.

Reguły rezerwacji to niestandardowe metody języka JavaScript, które będą wykonywane przed tworzeniem lub edycją rekordu rezerwacji zasobu możliwego do zarezerwowania. Metoda JavaScript może akceptować parametr, który będzie zawierać informacje dotyczące tworzonego rekordu rezerwacji zasobu możliwego do zarezerwowania i musi zwrócić obiekt JavaScript z wymaganymi właściwościami.

Skonfiguruj reguły rezerwacji dla sprawdzenia poprawności rezerwacji po jej utworzeniu lub zmodyfikowaniu.

Uwaga

  • Zasady rezerwacji są dostępne tylko dla widoku godzinowego, a nie dziennych, tygodniowych lub miesięcznych widoków tablicy harmonogramu i asystenta harmonogramu. Są one również dostępne, gdy rezerwacja jest tworzona lub aktualizowana za pomocą formularza rezerwacji zasobów, które można zarezerwować.
  • Zasady rezerwacji nie są dostępne w formularzu rezerwacji zasobów, które można zarezerwować, jeśli przepływ procesów biznesowych jest włączony w formularzu.
  • Zasady rezerwacji nie są dostępne w funkcji ponownego przypisania na tablicy harmonogramu.
  • Każda niestandardowa reguła rezerwacji może zwrócić tylko jeden błąd/ostrzeżenie. Aby zwrócić wiele wiadomości, skonfiguruj indywidualne reguły rezerwacji dla każdej walidacji.

Tworzenie rozwiązania

Pierwszym krokiem przy konfigurowaniu reguły rezerwacji jest utworzenie niestandardowego zasobu sieci Web języka JavaScript. Zaleca się, aby utworzyć rozwiązanie w programie CRM w celu dodania niestandardowego zasobu sieci Web języka JavaScript lub użyć istniejącego rozwiązania, które może zostać użyte do dostosowań.

Utwórz rozwiązanie CRM

  1. W obszarze Ustawienia>Rozwiązania utwórz nowe rozwiązanie na potrzeby reguł rezerwacji zasobów sieci Web języka JavaScript.

Na poniższym zrzucie ekranu jest widoczne nowoutworzone rozwiązanie. Zaleca się, aby w rozwiązanie korzystało z unikatowego wydawcy, zamiast wydawcy domyślnego.

Zrzut ekranu reguł rezerwacji dla usługi Field Service.

  1. Po utworzeniu rozwiązania wybierz składnik Zasoby sieci Web i utwórz nowy zasób sieci Web.
  2. W formularzu Nowy zasób sieci Web wprowadź następujące informacje: a. Nazwa b. Nazwa wyświetlana c. Wybierz Skrypt (Jscript) jako typ
  3. Wybierz opcję Edytor tekstów, aby wprowadzić kod JavaScript dla reguły rezerwacji.
  4. Wybierz Zapisz, aby zapisać zasób sieci Web.
  5. Wybierz Opublikuj, aby upewnić się, że zasób sieci Web reguły rezerwacji został opublikowany.

Zrzut ekranu nowego zasobu sieci Web.

Ustaw regułę rezerwacji

  1. W menu głównym przejdź do Field Service>Zasoby, a następnie wybierz Reguły rezerwacji w Ustawienia rezerwacji.

    Zrzut ekranu listy aktywnych reguł rezerwacji w Field Service.

  2. Wybierz +Nowy, aby utworzyć nową regułę rezerwacji.

  3. W formularzu Reguła rezerwacji wprowadź następujące informacje: a. Nazwa b. Zasób sieci Web (Wybierz ostatnio utworzony zasób sieci Web). c. Wprowadź nazwę metody zdefiniowaną w języku JavaScript.

    Zrzut ekranu przedstawiający reguły rezerwacji.

  4. Zapisz regułę rezerwacji. Po zapisaniu reguły rezerwacji będzie on używany przez widok godzinowy tablicy harmonogramu i asystenta harmonogramu lub formularz encji. Możesz dezaktywować rekord reguły rezerwacji, aby tablica harmonogramu, asystent harmonogramu lub formularz encji rezerwacji nie wykonywały reguły.

Uwaga

Zasady rezerwacji są obecnie obsługiwane tylko w widoku godzinowym tablicy harmonogramu i asystenta harmonogramu. Zasady rezerwacji są również obsługiwane, gdy rezerwacje są tworzone lub aktualizowane za pomocą formularza rezerwacji zasobów, które można zarezerwować. Reguły rezerwacji nie są wykonywane w przypadku usunięcia rekordu rezerwacji. Reguły rezerwacji nie działają w formularzach przy użyciu edycji wielu osób.

Utwórz akcję CRM

W tej sekcji zapoznamy się z przykładem ukazującym, jak użyć niestandardowej akcji CRM, aby przeprowadzić weryfikację jako część reguły rezerwacji.

W przypadku korzystania z akcji CRM na potrzeby weryfikacji reguły rezerwacji konieczne będzie utworzenie niestandardowego zasobu sieci Web, tak jak zdefiniowano powyżej. Skrypt JavaScript definiowany w ramach niestandardowego zasobu sieci Web wywoła niestandardową akcję CRM i oceni wyniki niestandardowej akcji CRM. Przykładowy kod, którego można użyć do wywołania niestandardowej akcji CRM, znajduje się w załączniku A na końcu tego dokumentu.

Niestandardowa akcja CRM będzie musiała zostać utworzona w CRM. Zaleca się użycie rozwiązania CRM zdefiniowanego dla niestandardowego zasobu sieci Web, aby dodać niestandardową akcję CRM.

Niestandardowa Akcja CRM powinna mieć następujące parametry wejściowe i wyjściowe. Użytkownik może dodać dodatkowe parametry wejścia i wyjścia, zgodnie z wymaganiami scenariusza. Należy się upewnić, że kod JavaScript definiowany przez użytkownika do wywołania niestandardowej akcji CRM zostanie zaktualizowany w taki sposób, aby obsługiwał dodatkowe parametry wejściowe i wyjściowe.

Parametry wejściowe:

  • originalScheduleStart – DateTime
  • originalScheduleEnd – DateTime
  • originalBookableResource – EntityReference
  • originalScheduleSource – Picklist
  • newScheduleStart – DateTime
  • newScheduleEnd – DateTime
  • isCreate – Boolean
  • isUpdate – Boolean

Parametry wyjściowe:

  • isError – Boolean
  • isWarning – Boolean
  • errorMessage – String
  • warningMessage - String

Poniższy zrzut ekranu ukazuje przykład niestandardowej akcji CRM. Ten przykład sprawdza, czy newBookableResource jest zgodny z preferowanym zasobem w zleceniu roboczym, i czy newScheduleStart znajduje się w zakresie Uzgodniona godzina początkowa and Uzgodniona godzina końcowa. Przyjmuje się, że daty w oknie uzgodnionym stanowią jedną datę. Przykład: Uzgodniona godzina początkowa: 01/01/2016 8:00 / Uzgodniona godzina końcowa: 01/01/2016 12:00.

Zrzut ekranu przedstawiający niestandardową akcję CRM.

Przykładowy kod

Utworzony kod JavaScript może akceptować jeden parametr, który jest traktowany jako kontekst rezerwacji. Parametr kontekstu przekazywanej rezerwacji nie jest typowy kontekst systemu CRM używany w skryptach po stronie klienta.

Schemat kontekstu rezerwacji:

export type BookingRuleContext = {
    oldValues: BookingRuleBookingRecord;
    newValues: BookingRuleBookingRecord;
    isCreate: boolean;
    isUpdate: boolean;
};
 
export type BookingRuleBookingRecord = {
    ResourceRequirementId?: string;
    ResourceId?: string;
    StartTime?: Date;
    EndTime?: Date;
    ResourceScheduleSource?: string;
};

Parametr kontekstu rezerwacji będzie zawierać następującą definicję języka JavaScript.

Uwaga

Nie trzeba dołączać tego kodu JavaScript do niestandardowego zasobu sieci Web dla reguły rezerwacji.

Dopuszczalne wartości dla ResourceScheduleSource pochodzą z globalnego zestawu opcji Źródło harmonogramu zasobów. Tej właściwości można użyć w celu ustalenia, czy reguła rezerwacji jest wyzwalana z poziomu tablicy harmonogramu czy asystenta planowania.

    var sbContext = {
    oldValues: {
        StartTime: "01/01/2016 08:00AM",
        EndTime: "01/01/2016 05:00PM",
        ResourceId: "00000000-0000-0000-0000-00000000",
        ResourceScheduleSource: 690970001
    },
    newValues: {
        StartTime: "01/01/2016 08:00AM",
        EndTime: "01/01/2016 05:00PM",
        ResourceId: "00000000-0000-0000-0000-00000000",
        ResourceScheduleSource: 690970001
    },
    isCreate: true,
    isUpdate: false
    };

Metoda weryfikacji musi zwrócić obiekt JavaScript z poniższą definicją.

Uwaga

Nie trzeba dołączać tego kodu JavaScript do niestandardowego zasobu sieci Web dla reguły rezerwacji.

    var ruleResult = {
    IsValid: false,
    Message: "Some Message Here",
    Type: "error" // this can be either "error" or "warning"
};

Przykładowa definicja funkcji JavaScript. Poniższy kod JavaScript jest jedynym kodem języka JavaScript, który należy dołączyć do niestandardowego zasobu sieci Web.


    function Validate(ctx) {
      var url = Xrm.Page.context.getClientUrl();
      var ruleResult = {
  	IsValid: false,
       Message: '',
       Type: 'error'
      };

      //
      // perform some lookups or other validation logic here.
      //
  
      ruleResult.IsValid = false;
      ruleResult.Message = 'Some Error Message Here.';
      ruleResult.Type = 'error';

      return ruleResult;
    }

Do wywołania niestandardowej akcji CRM, która ma te same parametry wejściowe i wyjściowe, co w poprzednim przykładzie, może służyć poniższy kod JavaScript.

W rekordzie reguły rezerwacji Nazwa metody musi być: MSFSAENG.ScheduleBoard.Validate. W celach referencyjnych zobacz zrzut ekranu w sekcji "Konfigurowanie reguły rezerwacji" niniejszego artykułu.


    /// <reference path="xrm.d.ts" />
    function brErrorCallback(sb) {
    // Add custom error handeling here if desired.
     return;
    }
    function brWarningCallback(sb) {
    // Add custom warning handeling here if desired.
    return;
    }
    function brSuccessCallback(sb) {
    // add custom sucess handeling here if desired.
    return;
    }
    var MSFSAENG;
    (function (MSFSAENG) {
    MSFSAENG.ScheduleBoard = {
        url: Xrm.Page.context.getClientUrl() + "/api/data/v8.1/",
        actionName: "msfsaeng_MSFSAScheduleBoardRuleActionSample",
        actionInputParameters: function (ctx) {
            var inputParameters = {};
            if (ctx.isUpdate) {
                inputParameters = {
                    "originalScheduleStart": ctx.oldValues.StartTime,
                    "originalScheduleEnd": ctx.oldValues.EndTime,
                    "originalBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.oldValues.ResourceId,
                        "name": ""
                    },
                    "originalScheduleSource": ctx.oldValues.ResourceScheduleSource,
                    "newScheduleStart": ctx.newValues.StartTime,
                    "newScheduleEnd": ctx.newValues.EndTime,
                    "newBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.newValues.ResourceId,
                        "name": ""
                    },
                    "newScheduleSource": ctx.newValues.ResourceScheduleSource,
                    "isCreate": ctx.isCreate,
                    "isUpdate": ctx.isUpdate
                };
            }
            else {
                inputParameters = {
                    "newScheduleStart": ctx.newValues.StartTime,
                    "newScheduleEnd": ctx.newValues.EndTime,
                    "newBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.newValues.ResourceId,
                        "name": ""
                    },
                    "newScheduleSource": ctx.newValues.ResourceScheduleSource,
                    "isCreate": ctx.isCreate,
                    "isUpdate": ctx.isUpdate
                };
            }
            return JSON.stringify(inputParameters);
        },
        ctx: null,
        ruleResult: {
            IsValid: true,
            Message: "",
            Type: ""
        },
        outputParameters: {
            isError: false,
            isWarning: false,
            errorMessage: "",
            warningMessage: ""
        },
        Validate: function (context) {
            this.ctx = context;
            ScheduleBoardHelper.callActionWebApi(this);
            return this.ruleResult;
        },
        errorCallback: brErrorCallback,
        warningCallback: brWarningCallback,
        successCallback: brSuccessCallback
    };
    var ScheduleBoardHelper = (function () {
        function ScheduleBoardHelper() {
        }
        ScheduleBoardHelper.callActionWebApi = function (sb) {
            var oDataEndpoint = sb.url + sb.actionName;
            var req = new XMLHttpRequest();
            req.open("POST", oDataEndpoint, false);
            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            req.setRequestHeader("OData-MaxVersion", "4.0");
            req.setRequestHeader("OData-Version", "4.0");
            req.onreadystatechange = function () {
                if (req.readyState == 4) {
                    req.onreadystatechange = null;
                    if (req.status == 200) {
                        sb.outputParameters = JSON.parse(req.response);
                        if (sb.outputParameters.isError) {
                            sb.ruleResult.IsValid = false;
                            sb.ruleResult.Message = sb.outputParameters.errorMessage;
                            sb.ruleResult.Type = 'error';
                            if (sb.errorCallback)
                                sb.errorCallback(sb);
                            return;
                        }
                        else if (sb.outputParameters.isWarning) {
                            sb.ruleResult.IsValid = false;
                            sb.ruleResult.Message = sb.outputParameters.warningMessage;
                            sb.ruleResult.Type = 'warning';
                            if (sb.warningCallback)
                                sb.warningCallback(sb);
                            return;
                        }
                        else {
                            sb.ruleResult.IsValid = true;
                            sb.ruleResult.Message = '';
                            sb.ruleResult.Type = '';
                            if (sb.successCallback)
                                sb.successCallback(sb);
                            return;
                        }
                    }
                    else {
                        alert('Error calling Rule Action. Response = ' + req.response + ', Status = ' + req.statusText);
                    }
                }
            };
            req.send(sb.actionInputParameters(sb.ctx));
        };
        return ScheduleBoardHelper;
    }());
    })(MSFSAENG || (MSFSAENG = {}));

Dodatkowe uwagi

Zasoby, które można zarezerwować, są włączone, by używać reguł rezerwacji do tworzenie ostrzeżeń o błędzie lub ostrzeżenia, które użytkownicy będą mogli zobaczyć podczas tworzenia lub edytowania rekordu rezerwacji zasobu, w zależności od warunków niestandardowych. W systemie są używane preventDefault w regułach rezerwacji. Z tego powodu przepływy procesów biznesowych i inne skrypty niestandardowe połączone ze zdarzeniem onSave nie mogą być używane w encji rezerwacji zasobów możliwej do rezerwacji, w przypadku których włączono reguły rezerwacji.

Przetwarzanie reguł rezerwacji można wyłączyć podczas zapisywania formularza Rezerwacja, włączając poniższe ustawienie, które pozwoli użytkownikom korzystać z przepływów procesów biznesowych. Do włączenia tego ustawienia na poziomie środowiska można użyć interfejsów API po stronie klienta.

Odczytaj bieżącą wartość ustawienia msdyn_DisableProcessBookingRulesOnSaveBookingForm.

Xrm.Utility.getGlobalContext().getCurrentAppSettings()["msdyn_DisableProcessBookingRulesOnSaveBookingForm"]

Włącz ustawienie msdyn_DisableProcessBookingRulesOnSaveBookingForm.

Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",true,).then(() => {a = "success"}, (error) => {a = error})

Wyłącz ustawienie **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",false,).then(() => {a = "success"}, (error) => {a = error})