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

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

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

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

หมายเหตุ

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

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

สร้างทรัพยากรบนเว็บ JavaScript แบบกําหนดเอง สร้างโซลูชันใน Microsoft Power Apps เพื่อเพิ่มทรัพยากรบนเว็บ JavaScript แบบกําหนดเองของคุณ หรือใช้โซลูชันที่มีอยู่ที่คุณใช้สําหรับการกําหนดเอง

  1. สร้างโซลูชันใหม่ สําหรับทรัพยากรบนเว็บ JavaScript ของกฎการจองของคุณ ใช้ผู้เผยแพร่ที่ไม่ซ้ํากันแทนที่จะเป็นผู้เผยแพร่เริ่มต้น

  2. หลังจากสร้างโซลูชัน สร้างทรัพยากรบนเว็บใหม่

  3. เลือก JavaScript (JS) เป็นชนิด

  4. ป้อนโค้ด JavaScript สําหรับกฎการจองของคุณ

  5. เลือก บันทึก และ เผยแพร่

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

  1. ไปยัง Field Service และเลือกพื้นที่ ทรัพยากร

  2. ภายใต้ การตั้งค่าการจอง เลือก กฎการจอง แล้วเลือก ใหม่

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

  3. ป้อนข้อมูลต่อไปนี้

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

หมายเหตุ

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

สร้างกระบวนการแบบกำหนดเอง

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

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

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

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

  • originalScheduleStart - วันที่และเวลา
  • เวลาสิ้นสุดตามกำหนดการเดิม – DateTime
  • originalBookableResource – การอ้างอิงเอนทิตี
  • originalScheduleSource - ตัวเลือก
  • newScheduleStart - วันที่และเวลา
  • newScheduleEnd – วันที่และเวลา
  • isCreate - บูลีน
  • isUpdate - บูลีน

พารามิเตอร์เอาต์พุต:

  • isError - บูลีน
  • isWarning - บูลีน
  • errorMessage – สตริง
  • warningMessage - สตริง

ภาพหน้าจอต่อไปนี้แสดงตัวอย่างการดำเนินการของกระบวนการแบบกำหนดเอง ตัวอย่างนี้จะตรวจสอบว่า newBookableResource ตรงกับทรัพยากรที่ต้องการในใบสั่งงานหรือไม่ และ newScheduleStart อยู่ภายใน เวลาจากสัญญา และ เวลาที่สัญญา จะถือว่าวันที่ของหน้าต่างที่สัญญาไว้สำหรับวันที่เดียว ตัวอย่าง: เวลาจากสัญญา: 01/01/2026 8:00 น. / เวลาถึงสัญญา: 01/01/2026 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})