แชร์ผ่าน


ตั้งค่ากฎการจอง

กฎการจองใน Field Service สร้างข้อความเตือนหรือข้อผิดพลาดที่ผู้ใช้เห็น เมื่อมีการสร้างหรือการแก้ไขเรกคอร์ดการจองทรัพยากร ที่ขึ้นอยู่กับเงื่อนไขที่กำหนดเอง ตัวอย่างเช่น กฎการจองสามารถถูกสร้างเพื่อเตือนผู้ใช้ เมื่อพวกเขาพยายามที่จะจองใบสั่งงานให้กับทรัพยากรบนบอร์ดตารางงานที่ไม่มีทักษะที่จำเป็นสำหรับงาน

กฎการจองเป็นวิธี JavaScript ที่กำหนดเองซึ่งจะดำเนินการก่อนหน้าเรกคอร์ดการจองทรัพยากรที่สามารถจองได้ที่สร้างหรือแก้ไข วิธี JavaScript สามารถยอมรับพารามิเตอร์ที่จะมีข้อมูลสำหรับเรกคอร์ดการจองทรัพยากรที่สามารถจองได้ที่สร้างขึ้น และจะต้องส่งคืนงออบเจ็กต์ JavaScript ที่มีคุณสมบัติที่จำเป็น

ตั้งค่ากฎการจองเพื่อตรวจสอบการจองเมื่อมีสร้างหรือปรับเปลี่ยน

หมายเหตุ

  • กฎการจองจะพร้อมใช้งานสำหรับมุมมองรายชั่วโมงเท่านั้น ไม่ใช่มุมมองรายวัน รายสัปดาห์ หรือรายเดือนของตารางกำหนดการและระบบจัดการกำหนดการ นอกจากนี้ยังพร้อมใช้งานเมื่อมีการสร้างหรืออัปเดตการจองผ่านฟอร์มการจองทรัพยากรที่สามารถจองได้
  • กฎการจองไม่มีอยู่ในฟอร์มการจองทรัพยากรที่สามารถจองได้ หากมีการเปิดใช้งานโฟลว์กระบวนการธุรกิจในฟอร์ม
  • กฎการจองไม่มีอยู่ในฟังก์ชันการกำหนดใหม่บนบอร์ดตารางงาน
  • กฎการจองแบบกำหนดเองแต่ละกฎสามารถส่งคืนข้อผิดพลาด/คำเตือนเพียงรายการเดียวเท่านั้น หากต้องการส่งคืนข้อความหลายรายการ ให้ตั้งค่ากฎการจองแต่ละรายการสำหรับการตรวจสอบความถูกต้องแต่ละครั้ง

สร้างโซลูชัน

ขั้นตอนแรกในการตั้งค่ากฎการจองของคุณคือการสร้างทรัพยากรบนเว็บ JavaScript ที่กำหนดเอง เราขอแนะนำให้คุณสร้างโซลูชันใน CRM เพื่อเพิ่มทรัพยากรบนเว็บ JavaScript ที่กำหนดเองหรือใช้โซลูชันที่มีอยู่ซึ่งคุณอาจมีสำหรับการกำหนดเอง

สร้างโซลูชัน CRM

  1. จาก การตั้งค่า>โซลูชัน สร้างโซลูชันใหม่สำหรับทรัพยากรบนเว็บ JavaScript ของกฎการจองของคุณ

ภาพหน้าจอต่อไปนี้แสดงโซลูชันที่สร้างขึ้นใหม่ เราขอแนะนำให้โซลูชันของคุณใช้ผู้เผยแพร่ที่ไม่ซ้ำกันแทนที่จะเป็นผู้เผยแพร่เริ่มต้น

ภาพหน้าจอของกฎการจอง Field Service

  1. หลังจากสร้างโซลูชันแล้วให้เลือกคอมโพเนนต์ทรัพยากรบนเว็บและสร้างทรัพยากรบนเว็บใหม่
  2. ในฟอร์มทรัพยากรบนเว็บใหม่ ป้อนข้อมูลต่อไปนี้: ก. ชื่อ b ชื่อที่ใช้แสดง ค. เลือก Script (Jscript) เป็นประเภท
  3. เลือกตัวเลือกแก้ไขข้อความเพื่อป้อนรหัส JavaScript ของคุณสำหรับกฎการจอง
  4. เลือก บันทึก เพื่อบันทึกทรัพยากรเว็บของคุณ
  5. เลือก เผยแพร่ เพื่อให้แน่ใจว่าทรัพยากรเว็บของกฎการจองได้รับการเผยแพร่แล้ว

ภาพหน้าจอของทรัพยากรเว็บใหม่

ตั้งค่ากฎการจอง

  1. จากเมนูหลัก ไปที่ Field service>ทรัพยากร แล้วเลือก กฎการจอง ภายใต้ การตั้งค่าการจอง

    ภาพหน้าจอของรายการกฎการจองที่ใช้านอยู่ใน Field Service

  2. เลือก สร้าง เพื่อสร้างกฎการจองใหม่

  3. บนฟอร์มกฎการจอง ให้ป้อนข้อมูลต่อไปนี้: ก. ชื่อ b ทรัพยากรบนเว็บ (เลือกทรัพยากรบนเว็บที่คุณเพิ่งสร้างขึ้น) ค. ป้อนชื่อวิธีการที่คุณกำหนดใน JavaScript ของคุณ

    ภาพหน้าจอของกฎการจอง

  4. บันทึกกฎการจองของคุณ เมื่อคุณบันทึกกฎการจอง กฎนั้นจะถูกใช้โดยมุมมองรายชั่วโมงของตารางกำหนดการและระบบจัดการกำหนดการหรือฟอร์มเอนทิตี คุณสามารถปิดใช้งานเรกคอร์ดกฎการจองของคุณเพื่อไม่ให้ตารางกำหนดการ ระบบจัดการกำหนดการ หรือฟอร์มเอนทิตีการจองดำเนินการกฎ

หมายเหตุ

กฎการจองในปัจจุบันได้รับการสนับสนุนเฉพาะในมุมมองรายชั่วโมงของตารางกำหนดการและระบบจัดการกำหนดการเท่านั้น กฎการจองยังได้รับการสนับสนุนเมื่อมีการสร้างหรืออัปเดตการจองโดยใช้ฟอร์มการจองทรัพยากรที่สามารถจองได้ กฎการจอง ไม่ ดำเนินการเมื่อลบเรกคอร์ดการจอง กฎการจองไม่ทำงานบนฟอร์มเมื่อใช้การแก้ไขหลายรายการ

สร้างการดำเนินการ CRM

ในส่วนนี้เราจะดูตัวอย่างที่แสดงวิธีที่คุณสามารถใช้การดำเนินการ CRM แบบกำหนดเองเพื่อทำการตรวจสอบความถูกต้องโดยเป็นส่วนหนึ่งของกฎการจอง

เมื่อใช้การดำเนินการ CRM สำหรับการตรวจสอบความถูกต้องของกฎการจอง คุณจะยังคงต้องสร้างทรัพยากรเว็บที่กำหนดเองตามที่กำหนดไว้ข้างต้น JavaScript ที่คุณจะกำหนดในทรัพยากรเว็บที่กำหนดเองของคุณจะเรียกการดำเนินการ CRM ที่กำหนดเอง และประเมินผลจากการดำเนินการ CRM ที่กำหนดเอง ดูเอกสารแนบ A ที่ท้ายเอกสารนี้เพื่อดูตัวอย่างรหัสที่คุณสามารถใช้เพื่อเรียกการดำเนินการ CRM ที่กำหนดเอง

การดำเนินการ CRM ที่กำหนดเองจะต้องถูกสร้างขึ้นใน CRM เราขอแนะนำให้คุณใช้โซลูชัน CRM ที่คุณกำหนดไว้สำหรับทรัพยากรบนเว็บแบบกำหนดเองของคุณเพื่อเพิ่มการดำเนินการ CRM แบบกำหนดเองของคุณ

การดำเนินการ CRM แบบกำหนดเองควรมีพารามิเตอร์ข้อมูลป้อนเข้าและผลลัพธ์ต่อไปนี้ คุณสามารถเพิ่มพารามิเตอร์ข้อมูลป้อนเข้าและผลผลิตเพิ่มเติมได้ตามที่สถานการณ์ต้องการ คุณจะต้องตรวจสอบให้แน่ใจว่า JavaScript ที่คุณกำหนดเพื่อเรียกใช้การดำเนินการ CRM ที่กำหนดเองของคุณได้รับการอัปเดตเพื่อรองรับพารามิเตอร์ข้อมูลป้อนเข้าและผลลัพธ์อื่นๆ ของคุณ

พารามิเตอร์ข้อมูลป้อนเข้า:

  • originalScheduleStart - วันที่และเวลา
  • originalScheduleEnd - วันที่และเวลา
  • originalBookableResource - EntityReference
  • originalScheduleSource - ตัวเลือก
  • newScheduleStart - วันที่และเวลา
  • newScheduleStart - วันที่และเวลา
  • isCreate - บูลีน
  • isUpdate - บูลีน

พารามิเตอร์ผลผลิต:

  • isError - บูลีน
  • isWarning - บูลีน
  • ข้อความแสดงข้อผิดพลาด – สตริง
  • 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 นี้ในทรัพยากรบนเว็บที่กำหนดเองสำหรับกฎการจอง

ค่าที่เป็นไปได้สำหรับ 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 นี้ในทรัพยากรบนเว็บที่กำหนดเองสำหรับกฎการจอง

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

ตัวอย่างนิยามฟังก์ชัน JavaScript รหัส JavaScript ต่อไปนี้เป็นรหัส JavaScript เดียวที่คุณต้องรวมไว้ในทรัพยากรบนเว็บที่กำหนดเอง


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