Κοινή χρήση μέσω


Ρύθμιση κανόνων κράτησης

Η κράτηση κανόνων στο Field Service δημιουργεί μηνύματα προειδοποίησης ή σφάλματος, τα οποία βλέπουν οι χρήστες κατά τη δημιουργία ή την επεξεργασία μιας εγγραφής κράτησης πόρων, με βάση τις προσαρμοσμένες συνθήκες. Για παράδειγμα, ένας κανόνας κράτησης μπορεί να δημιουργηθεί για να προειδοποιήσει το χρήστη, όταν προσπαθεί να κάνει κράτηση σε μια παραγγελία εργασίας για έναν πόρο στον πίνακα χρονοδιαγράμματος, που δεν έχει τις επιθυμητές δεξιότητες που απαιτούνται για την εργασία.

Οι κανόνες κράτησης είναι προσαρμοσμένες μέθοδοι JavaScript που εκτελούνται πριν από τη δημιουργία ή την επεξεργασία της καρτέλας κράτησης πόρου με δυνατότητα κράτησης. Η μέθοδος JavaScript μπορεί να αποδεχτεί μια παράμετρο που θα περιέχει πληροφορίες για την καρτέλα Κράτηση πόρου με δυνατότητα κράτησης που δημιουργείται και πρέπει να επιστρέψει ένα αντικείμενο JavaScript με τις απαιτούμενες ιδιότητες.

Ρυθμίστε κανόνες κράτησης για να επικυρώσετε μια κράτηση όταν δημιουργείται ή τροποποιείται.

Σημείωμα

  • Οι κανόνες κράτησης είναι διαθέσιμοι μόνο για την ωριαία προβολή και όχι καθημερινές, εβδομαδιαίες ή μηνιαίες προβολές του πίνακα χρονοδιαγράμματος και του βοηθού χρονοδιαγράμματος. Είναι επίσης διαθέσιμες όταν δημιουργείται ή ενημερώνεται μια κράτηση μέσω της φόρμας κράτησης πόρου με δυνατότητα κράτησης.
  • Οι κανόνες κράτησης δεν είναι διαθέσιμοι στη φόρμα κράτησης πόρου με δυνατότητα κράτησης, εάν η ροή επιχειρηματικής διαδικασίας είναι ενεργοποιημένη στη φόρμα.
  • Οι κανόνες κράτησης δεν είναι διαθέσιμοι στη λειτουργικότητα εκ νέου εκχώρησης στον πίνακα χρονοδιαγράμματος.
  • Κάθε προσαρμοσμένος κανόνας κράτησης μπορεί να επιστρέψει μόνο ένα σφάλμα/προειδοποίηση. Για να επιστρέψετε πολλά μηνύματα, ορίστε μεμονωμένους κανόνες κράτησης για κάθε επικύρωση.

Δημιουργία μιας λύσης

Το πρώτο βήμα για τη ρύθμιση του κανόνα κράτησής σας είναι να δημιουργήσετε έναν προσαρμοσμένο πόρο Web JavaScript. Συνιστάται η δημιουργία μιας λύσης στο CRM για την προσθήκη του προσαρμοσμένου πόρου Web JavaScript που διαθέτετε ή η χρήση μιας υπάρχουσας λύσης που μπορεί να έχετε για προσαρμογές.

Δημιουργία λύσης CRM

  1. Από τις Ρυθμίσεις>Λύσεις, δημιουργήστε μια νέα λύση για τους πόρους Web JavaScript των κανόνων κράτησής σας.

Το παρακάτω στιγμιότυπο οθόνης παρουσιάζει μια λύση που μόλις δημιουργήσατε. Συνιστάται η λύση σας να χρησιμοποιεί έναν μοναδικό εκδότη και όχι τον προεπιλεγμένο εκδότη.

Στιγμιότυπο οθόνης των κανόνων κράτησης για το Field Service.

  1. Μετά τη δημιουργία της λύσης, επιλέξτε το στοιχείο "Πόροι Web" και δημιουργήστε έναν νέο πόρο Web.
  2. Στη φόρμα νέου πόρου web, καταχωρίστε τις παρακάτω πληροφορίες: α. Όνομα β. Εμφανιζόμενο όνομα γ. Επιλέξτε Δέσμη ενεργειών (Jscript) ως Τύπο.
  3. Επιλέξτε την επιλογή προγράμματος επεξεργασίας κειμένου για να εισάγετε τον κώδικα JavaScript που διατίθεται για τον κανόνα κράτησης.
  4. Επιλέξτε Αποθήκευση για να αποθηκεύσετε τον πόρο web.
  5. Επιλέξτε Δημοσίευση για να βεβαιωθείτε ότι έχει δημοσιευτεί ο πόρος Web κανόνων κράτησης.

Στιγμιότυπο οθόνης νέου πόρου web.

Ρύθμιση κανόνα κράτησης

  1. Από το κύριο μενού, μεταβείτε στην επιλογή Field Service>Πόροι και, στη συνέχεια, επιλέξτε Κανόνες κράτησης στην περιοχή Ρυθμίσεις κράτησης.

    Στιγμιότυπο οθόνης της λίστας ενεργών κανόνων κράτησης στο Field Service.

  2. Επιλέξτε +Νέος για να δημιουργήσετε έναν νέο κανόνα κράτησης.

  3. Από τη φόρμα κανόνα κράτησης εισαγάγετε τις ακόλουθες πληροφορίες: α. Όνομα β. Πόρος Web (επιλέξτε τον πόρο Web που δημιουργήσατε πρόσφατα). γ. Καταγράψτε το όνομα μεθόδου που καθορίσατε στη JavaScript σας.

    Στιγμιότυπο οθόνης για τους κανόνες κράτησης

  4. Αποθηκεύστε τον κανόνα κράτησής σας. Αφού αποθηκεύσετε τον κανόνα κράτησης, θα χρησιμοποιηθεί στην ωριαία προβολή του πίνακα χρονοδιαγράμματος και του βοηθού χρονοδιαγράμματος ή της φόρμας οντότητας. Μπορείτε να απενεργοποιήσετε την καρτέλα κανόνα κράτησης για να διατηρήσετε τον πίνακα χρονοδιαγράμματος, τον βοηθό χρονοδιαγράμματος ή τη φόρμα οντότητας κράτησης, από την εκτέλεση του κανόνα.

Σημείωμα

Προς το παρόν, οι κανόνες κράτησης υποστηρίζονται μόνο στην ωριαία προβολή του πίνακα χρονοδιαγράμματος και του βοηθού χρονοδιαγράμματος. Οι κανόνες κράτησης υποστηρίζονται επίσης όταν οι κρατήσεις δημιουργούνται ή ενημερώνονται χρησιμοποιώντας τη φόρμα κράτησης πόρου με δυνατότητα κράτησης. Οι κανόνες κράτησης δεν εκτελούνται κατά τη διαγραφή μιας καρτέλας κράτησης. Οι κανόνες κράτησης δεν λειτουργούν σε φόρμες όταν χρησιμοποιούν πολλαπλή επεξεργασία.

Δημιουργία ενέργειας CRM

Σε αυτήν την ενότητα, θα δούμε ένα παράδειγμα που δείχνει τον τρόπο με τον οποίο μπορείτε να χρησιμοποιήσετε μια προσαρμοσμένη ενέργεια CRM για να εκτελέσετε την επικύρωση ως μέρος ενός κανόνα κράτησης.

Όταν χρησιμοποιείτε μια ενέργεια CRM για την επικύρωση των κανόνων κράτησης, θα πρέπει να δημιουργήσετε έναν προσαρμοσμένο πόρο Web όπως καθορίζεται παραπάνω. Η JavaScript που θα ορίσετε στον προσαρμοσμένο πόρο Web θα καλεί την προσαρμοσμένη ενέργεια CRM και θα αξιολογεί τα αποτελέσματα από την προσαρμοσμένη ενέργεια CRM. Ανατρέξτε στην ενότητα Συνημμένο Α στο τέλος αυτού του εγγράφου για δείγμα κώδικα, το οποίο μπορείτε να χρησιμοποιήσετε για την κλήση μιας προσαρμοσμένης ενέργειας CRM.

Θα πρέπει να δημιουργηθεί μια προσαρμοσμένη ενέργεια CRM στο CRM. Συνιστούμε να χρησιμοποιήσετε τη λύση CRM που έχετε ορίσει για τον προσαρμοσμένο πόρο Web για να προσθέσετε την προσαρμοσμένη ενέργεια CRM που διαθέτετε.

Η προσαρμοσμένη ενέργεια CRM θα πρέπει να έχει τις ακόλουθες παραμέτρους εισόδου και εξόδου. Μπορείτε να προσθέσετε περισσότερες παραμέτρους εισόδου και εξόδου, όπως απαιτεί το σενάριό σας. Θα πρέπει να διασφαλίσετε ότι η JavaScript που καθορίζετε για να καλέσετε την προσαρμοσμένη ενέργεια CRM ενημερώνεται για την υποστήριξη των άλλων παραμέτρων εισόδου και εξόδου.

Παράμετροι εισόδου:

  • originalScheduleStart – DateTime
  • originalScheduleEnd – DateTime
  • originalBookableResource – EntityReference
  • originalScheduleSource – Picklist
  • newScheduleStart – DateTime
  • newScheduleEnd – DateTime
  • isCreate – Δυαδική τιμή
  • isUpdate – Δυαδική τιμή

Παράμετροι εξόδου:

  • isError – Δυαδική τιμή
  • isWarning – Δυαδική τιμή
  • errorMessage – Συμβολοσειρά
  • warningMessage - Συμβολοσειρά

Το παρακάτω στιγμιότυπο οθόνης δείχνει ένα παράδειγμα προσαρμοσμένης ενέργειας CRM. Αυτό το δείγμα ελέγχει εάν το newBookableResource ταιριάζει με τον προτιμώμενο πόρο στη σειρά εργασίας και εάν το newScheduleStart είναι εντός του χρόνου από τον Χρόνο από υπόσχεση και τον Χρόνο έως υπόσχεση. Θεωρείται ότι οι ημερομηνίες του παραθύρου υπόσχεσης αφορούν μία ημερομηνία. Παράδειγμα: Χρόνος από υπόσχεση: 01/01/2016 8:00 ΠΜ / Χρόνος έως υπόσχεση: 01/01/2016 12:00 ΜΜ.

Στιγμιότυπο οθόνης προσαρμοσμένης ενέργειας CRM.

Δείγμα κώδικα

Η λειτουργία JavaScript που δημιουργήσατε μπορεί να αποδεχτεί μια μεμονωμένη παράμετρο, η οποία θεωρείται το περιβάλλον κράτησης. Η παράμετρος περιβάλλοντος κράτησης που μεταβιβάστηκε δεν είναι ένα τυπικό περιβάλλον CRM που χρησιμοποιείται σε δέσμες ενεργειών υπολογιστή-πελάτη.

Σχήμα περιβάλλοντος κράτησης:

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

Η παράμετρος περιβάλλοντος κράτησης θα έχει τον ακόλουθο ορισμό JavaScript.

Σημείωμα

Δεν χρειάζεται να συμπεριλάβετε αυτόν τον κώδικα JavaScript στον προσαρμοσμένο πόρο Web για τον κανόνα κράτησης.

Οι πιθανές τιμές για το ResourceScheduleSource προέρχονται από το καθολικό σύνολο επιλογών προέλευσης χρονοδιαγράμματος πόρων. Μπορείτε να χρησιμοποιήσετε αυτήν την ιδιότητα για να γνωρίζετε εάν ο κανόνας κράτησης ενεργοποιείται από τον πίνακα χρονοδιαγράμματος ή τον βοηθό προγραμματισμού.

    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
    };

Η μέθοδος επικύρωσης πρέπει να επιστρέψει ένα αντικείμενο JavaScript με τον ακόλουθο ορισμό.

Σημείωμα

Δεν χρειάζεται να συμπεριλάβετε αυτόν τον κώδικα JavaScript στον προσαρμοσμένο πόρο Web για τον κανόνα κράτησης.

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

Παράδειγμα ορισμού συνάρτησης JavaScript. Ο παρακάτω κώδικας JavaScript είναι ο μόνος κώδικας JavaScript που θα πρέπει να συμπεριλάβετε στον προσαρμοσμένο πόρο 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;
    }

Η παρακάτω JavaScript μπορεί να χρησιμοποιηθεί για την κλήση μιας προσαρμοσμένης ενέργειας CRM η οποία έχει τις ίδιες παραμέτρους εισόδου και εξόδου με το προηγούμενο δείγμα.

Στην καρτέλα κανόνα κράτησης, το Όνομα μεθόδου πρέπει να είναι: MSFSAENG.ScheduleBoard.Validate. Για αναφορά, ανατρέξτε στο στιγμιότυπο οθόνης στην ενότητα "Ρύθμιση κανόνων κράτησης" αυτού του άρθρου.


    /// <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 = {}));

Πρόσθετες σημειώσεις

Η κράτηση πόρου με δυνατότητα κράτησης ενεργοποιείται για την αξιοποίηση κανόνων κράτησης με σκοπό τη δημιουργία προειδοποίησης ή σφαλμάτων τα οποία βλέπουν οι χρήστες κατά τη δημιουργία ή την επεξεργασία μιας εγγραφής κράτησης πόρων, με βάση τις προσαρμοσμένες συνθήκες. Το σύστημα χρησιμοποιεί preventDefault στους κανόνες κράτησης. Ως εκ τούτου, οι ροές επιχειρησιακών διεργασιών και άλλα προσαρμοσμένα σενάρια που συνδέονται με το onSaveσυμβάν δεν μπορούν να χρησιμοποιηθούν στην οντότητα κράτησης πόρων με δυνατότητα κράτησης με ενεργοποιημένους κανόνες κράτησης.

Ωστόσο, η επεξεργασία των κανόνων κράτησης μπορεί να απενεργοποιηθεί στην αποθήκευση της φόρμας Κράτηση, ενεργοποιώντας την παρακάτω ρύθμιση, η οποία θα επιτρέψει στους χρήστες να χρησιμοποιήσουν τις ροές επιχειρηματικής διαδικασίας. Τα API υπολογιστή-πελάτη μπορούν να χρησιμοποιηθούν για την ενεργοποίηση αυτής της ρύθμισης σε επίπεδο περιβάλλοντος.

Διαβάστε την τρέχουσα τιμή της ρύθμισης msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Ενεργοποιήστε τη ρύθμιση msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Απενεργοποιήστε τη ρύθμιση **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

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