使用 API 编辑工作时间日历

组织通常需要以编程方式在其资源的日历上创建、编辑或删除工作时间。 日历显示工作时间、休假和休息时间,这些时间决定了计划工作时资源的可用性。 这些资源必须在特定时区进行调度,可能会也可能不会观察到业务关闭,并且可以具有可变的容量。 有关在 Field Service 应用中定义工作时间的信息,请转到将 工作时间添加到可预订资源

除了使用 Field Service 应用外,您还可以使用以下 API 修改所选记录类型的日历规则:

  • 保存日历 API (msdyn_SaveCalendar) 根据作为请求传递的输入在所选实体上创建或更新日历记录。
  • 删除日历 API (msdyn_DeleteCalendar) 根据作为请求传递的输入,删除所选实体上日历的所有 内部日历规则
  • 保存/删除日历 API V2(msdyn_SaveCalendar/msdyn_DeleteCalendar,传递标志 UseV2)通过更改重叠规则的逻辑,允许同时重复多个工作时间。 有关详细信息,请参阅 如果存在重叠规则会发生什么情况?

本文详细介绍了每个 API 的输入(请求)和输出(响应)及其用法,并附有示例。

先决条件

  • 平台版本 9.2.21055 或更高版本,具有 Universal Resource Scheduling 版本 3.12.45.7。
  • 使用以下记录类型之一:
    • 可预订资源 (bookableresource)
    • 资源需求 (msdyn_resourcerequirement)
    • 工作时间模板 (msdyn_workhourtemplate)
    • 项目 (msdyn_project)

日历事件类型

创建日历时,可以定义 工作时间类型 出现的次数(一次、全天、每周或每天),也可以创建自定义重复周期。 有关这些日历事件的详细信息,请转到 本文后面的示例

发生

当工作时间类型在实体的日历中仅出现一次时,称为 “出现”

例如,假设一个资源在 2021 年 5 月 26 日凌晨 5:00 到上午 10:00 工作。 这些 API 仅支持此类事件,该事件在同一天内开始和结束。 再举一个例子,假设一个资源从 2021 年 5 月 26 日晚上 8:00 到 2021 年 5 月 27 日上午 10:00 开始工作。 不能仅使用一次 API 调用 msdyn_SaveCalendar 来创建此事件;您需要进行两次调用。

全天发生

当工作时间类型从开始日期的午夜 (凌晨 12:00) 开始,持续一整天时,该类型将全 天发生。 全天事件的最长持续时间为五年。

例如,资源从 2021 年 5 月 26 日到 2021 年 5 月 30 日一天结束全天工作。 这是持续五天的全天事件。

每周复发

当工作时间类型在每周的选定日期同时发生时,称为 每周重复

例如,资源的工作时间为每周一、周二和周三的上午 5:00 至上午 10:00。

每日复发

当工作时间类型每天在同一时间发生时,称为 每日重复周期。

例如,资源的工作时间为一周中的每一天上午 5:00 至上午 10:00。

自定义定期

如果工作时间类型在一周中某些日期的特定时间出现,但不同日期的时间不同,则可以创建 自定义重复周期

例如,资源的工作时间为每周一凌晨 5:00 至上午 10:00,每周三中午 12:00 至下午 3:00。

工作时间类型

这些 API 支持对以下工作时间类型的创建、更新和删除作:

工作时间

工作时间是实体可以执行工作的时间。

使用这些 API,您可以执行以下作:

  • 创建、编辑或删除工作时间具体值。
  • 创建、编辑或删除每日重复工作时间。
  • 创建、编辑或删除每周重复的工作时间。
  • 创建、编辑或删除工作时间自定义定期。
  • 创建、编辑或删除全天工作时间。
  • 在工作时间创建或编辑产能。
  • 在重复周期中编辑单个工作时间事件。
  • 编辑 重复中此和以下匹配项
  • 将工作时间事件更改为重复事件。
  • 更改日历规则的时区。

使用此 API,您无法执行以下作:

  • 从定期事件中删除单个工作时间事件。
  • 创建一个跨越 24 小时但不在午夜 (凌晨 12:00) 开始和结束的事件。
  • 创建、编辑或删除全天重复周期。

非工作时间

这些时间实体由于未指定的原因而无法工作。

使用这些 API,您可以执行以下作:

  • 创建或编辑全天非工作时间。
  • 创建或编辑非工作时间事件。
  • 更改日历规则的时区。

使用这些 API,您无法执行以下作:

  • 创建或编辑非工作时间重复周期。

中断

这些是工作日中实体休息且无法工作的时间。 没有工作时间,休息就不可能存在;它们必须发生在一天中的两个工作小时之间。 休息时间不能与工作时间重叠。

使用这些 API,您可以执行以下作:

  • 在工作时间创建或编辑休息时间。

使用这些 API,您无法执行以下作:

  • 仅删除工作时间发生或重复的中断。

休息时间

这些是实体因休假而无法工作的时间。 可以指定休假原因。

使用这些 API,您可以执行以下作:

  • 使用标签创建或编辑休假。
  • 更改日历规则的时区。

使用这些 API,您无法执行以下作:

  • 创建或编辑休假时间重复周期。

企业关闭

您可以 创建定义企业关闭时间的企业关闭实体 。 使用 msdyn_SaveCalendar API,您可以使用可选的 ObserveClosure 密钥将每个实体设置为观察或忽略组织的业务关闭时间。 当它们设置为观察这些关闭时,实体将无法工作。

保存日历 API

Input

请求仅包含一个属性 - CalendarEventInfo,它是 String 类型。 它包含嵌入在此字符串中的其他几个属性。

注释

在下表中, 类型 表示成功请求所需的格式。 但是,整个请求被解析为单个字符串。

日历事件信息

名称 类型 Required 说明
EntityLogicalName String 是的 此键描述从中调用 API 的实体。 将创建或编辑此实体的日历。
日历 ID GUID 是的 此键包含与上述实体相关的日历 ID。 创建这些实体中的任何一个时,也会自动创建日历记录。 这些 API 通过添加规则或编辑现有规则来编辑该日历记录。
规则和重复 规则和重复 是的 此键是一个数组,每个元素包含以下部分表中列出的多个属性。 数组的大小应至少为 1。
是可变的 布尔 对于自定义定期方案,应将此键设置为。true
是编辑 布尔 应将此键设置为 以 true 编辑现有规则。
时区代码 整数 此键采用与日历规则的时区相对应的整数值。 有关映射,请转到本文后面的 时区代码。 默认值是用户的时区。
InnerCalendar描述 String 仅当日历规则用于休假时才需要此键。 它应该包含休假的原因。
观察闭包 布尔 此键特定于重复。 如果设置为 true,则实体将观察到业务关闭。
重复结束日期 日期和时间 此键特定于重复。 它包含重复周期的结束日期。 如果时间戳为 08:00:00 或更早,则重复结束日期为指定日期的前一天。 如果时间戳为 08:00:01 或更高,则该日期将遵循 as-is。 出现次数的默认值为 null。 重复周期的默认值为 30 Dec 9999, 23:59:59 hours, UTC。
重复拆分 布尔 此键特定于重复。 它设置为 true 用于编辑重复的“此次和后续事件”。
ResourceId GUID 此键包含 SystemUserIdResourceId ,仅当与此调用关联的实体是 SystemUser 类型的可预订资源时才会传递。 这是在 “服务管理 ”选项卡上检查 OwnCalendar 权限所必需的。
使用V2 Flag 传递此标志将启用 V2 版本的工作时间日历,并具有增强的重叠规则逻辑,允许多次重复。 有关详细信息,请参阅 如果存在重叠规则会发生什么情况?

规则和重复

Name 类型 必选 Description
规则 规则 是的 此键是一个数组,每个元素包含以下部分表中列出的多个属性。 数组的大小应至少为 1。
RecurrencePattern String 此键特定于重复。 我们目前仅支持以下模式: FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SABYDAY 可以更改以包含更少的天数;但是, FREQ 并且 INTERVAL 无法更改。
InnerCalendarId GUID 此键特定于编辑。 如果正在编辑规则,则需要在此处传递 InnerCalendarId 。 如果未传递 InnerCalendarId ,则 API 会创建一个新规则,即使 IsEdit 键设置为 true。
Action 整数 此键特定于自定义重复周期。 如果正在创建或编辑自定义定期,则应输入以下数字之一:
  • (1) 在重复中增加一天
  • (2) 从重复中删除一天
  • (3) 仅编辑开始或结束日期或时间,或编辑容量
  • (4) 编辑 (3) 中提到的键以外的任何内容

规则

Name 类型 必选 Description
StartTime 日期和时间 是的 此键包含 ISO 格式的日期时间条目。 例如,\"2021-05-15T12:00:00.000Z\"。 时间部分确定之前指定的时区中工作时间的开始时间。 日期部分确定工作时间的开始日期。 这里,2021 年 5 月 15 日是发生日期或复发的开始日期。 如果模式是 BYDAY=TU,WE,但 5 月 15 日(星期六)是日期,则 API 将自动创建或编辑 5 月 15 日之后所有星期二和星期三的规则。 在这种情况下,规则不必具有与日期相对应的日期。
EndTime 日期和时间 是的 这包含 ISO 格式的日期时间条目。 例如,\"2021-05-15T12:00:00.000Z\"。 时间部分确定之前指定的时区中工作时间的结束时间。 日期部分 必须 包含与 StartTime 的日期部分相同的日期。 唯一的例外是:
  • 如果是一整天发生的话。 在这种情况下,日期部分应反映全天事件的结束日期。
  • 事件在一天结束时结束,即第二天凌晨 12:00。 在这种情况下,日期应为 \"2021-05-16T00:00:00.000Z\"。 若要指定定期的结束日期,请修改 RecurrenceEndDate 属性。
工作时间类型 整数 是的 此键包含与以下选项之一相对应的数字:
  • (0) 工作
  • (1)休息
  • (2) 不工作
  • (3) 休假
Effort 整数 此键确定实体的容量。 它必须是一个整数。 默认值为 1。

输出

此 POST API 为所选实体创建或修改日历规则记录。 它还给出了以下输出。

名称 类型 说明
InnerCalendarIds String 作为 POST作结果的 InnerCalendarIds GUID 数组。

删除日历 API

Input

名称 类型 Required 说明
EntityLogicalName String 是的 此字段描述要删除其日历规则的实体。
InnerCalendarId GUID 是的 此字段描述需要删除的 InnerCalendarId 的 ID。 如果有多个 InnerCalendarId 与单个规则关联,则此处任何一个 ID 都足够了。 有关内部日历和外部日历的详细信息: 日历实体
日历 ID GUID 是的 此字段描述实体的 CalendarId
是可变的 布尔 此字段特定于定期,并在删除自定义定期规则时设置为。yes
使用V2 Flag 传递此标志将启用 V2 版本的工作时间日历,并具有增强的重叠规则逻辑,允许多次重复。 有关详细信息,请参阅 如果存在重叠规则会发生什么情况?

输出

此 POST API 删除所选实体的日历规则记录。 此外,它还提供以下输出。

Name 类型 Description
InnerCalendarIds String 作为 POST作结果的 InnerCalendarIds GUID 数组。

加载日历 API

Input

名称:msdyn_LoadCalendars
类型:作
说明:返回给定 LoadCalendarsInput 的日历。

名称:msdyn_LoadCalendars.LoadCalendarsInput
类型:参数
说明:以下 JSON 格式的字符串:

{
   StartDate: string,
   EndDate: string,
   CalendarIds: string[]
}

名称:msdyn_LoadCalendarsResponse
类型:ComplexType
说明:包含msdyn_loadCalendars作的响应。

名称:msdyn_LoadCalendarsResponse.CalendarEvents
类型:属性
说明:以下 JSON 格式的字符串:

{
"calendarId": CalendarEventSlot[]
}

其中 calendarId 是表示日历的 Guid 的正确 guid,而 CalendarEventSlot 是以下格式的对象:

{
  CalendarId: string,
  InnerCalendarId: string,
  Start: string,
  End: string,
  Effort: double
}

如何调用 API

可以使用浏览器调用这些 API。

  1. 打开需要在其中进行这些日历更改的浏览器和组织。
  2. 打开开发人员工具(在 Microsoft Edge 中选择 Ctrl+Shift+I ,在 Google Chrome 中选择 F12 )。
  3. 在控制台中,将 [org-name] 替换为组织详细信息(例如, http://your_org.crm.dynamics.com)后输入以下函数:
       function CalendarAction(action, data) {
           let req = new XMLHttpRequest();
           req.open("POST", "**[org-name]**/api/data/v9.0/" + action, true);
           req.setRequestHeader("OData-MaxVersion", "4.0");
           req.setRequestHeader("OData-Version", "4.0");
           req.setRequestHeader("Accept", "application/json");
           req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
           req.setRequestHeader("Prefer", 'odata.include-annotations="*"');
           req.onreadystatechange = function () {
               if (this.readyState === 4) {
                   req.onreadystatechange = null;
                   if(this.status == 200) {
                       console.log(JSON.parse(this.response));
                   } else {
                       console.error(JSON.parse(this.response));
                   }
               }
           };
           req.send(JSON.stringify(data));
       }
  1. 定义此函数后,您可以使用 API 调用它来创建、编辑或删除日历。 输入以下调用以保存日历:
       CalendarAction("msdyn_SaveCalendar",{
           "CalendarEventInfo":"{
               \"CalendarId\":\"df0857c4-50f5-4576-8e89-f236670ad2d5\",
               \"EntityLogicalName\":\"bookableresource\",
               \"TimeZoneCode\":92,\"StartDate\":\"2021-04-25T00:00:00.000Z\",
               \"IsVaried\":false,
               \"RulesAndRecurrences\":[{
                   \"Rules\":[{
                       \"StartTime\":\"2021-04-25T08:00:00.000Z\",
                       \"EndTime\":\"2021-04-25T17:00:00.000Z\",
                       \"Duration\":540,
                       \"Effort\":1
                   }]
               }]
           }"
       })

输入以下调用以删除日历:

       CalendarAction("msdyn_DeleteCalendar", {
           "CalendarEventInfo":"{
               \"CalendarId\":\"8390358c-77d0-430f-b176-f27adadac8eb\",
               \"EntityLogicalName\":\"bookableresource\",
               \"InnerCalendarId\":\"cf508c2c-5c55-485c-be1e-d2ebcb385441\"
           }"
       })
       

有关如何根据您的需求进行不同呼叫的示例,请参阅以下部分。 将步骤 3 中函数调用的 替换 actionmsdyn_SaveCalendarmsdyn_DeleteCalendar或 ,并替换 data 为相关的 CalendarEventInfo

另请参阅以下屏幕截图,了解 Power Automate msdyn_SaveCalendar 号召性用语: Power Automate 号召msdyn_SaveCalendar作。

API 使用示例场景

让我们演练一下可以使用这些 API 的一些方案。

Bob 和 Tim 是华盛顿州贝尔维尤 Contoso Enterprises 的送货卡车司机。 他们的调度员 Debbie 负责更改他们的工作时间日历。 Debbie 使用 和 msdyn_SaveCalendarmsdyn_DeleteCalendar API 进行这些更改。

创建工作时间具体值。

Bob 计划于 2021 年 5 月 15 日上午 9:00 至下午 5:00 开车四处递送包裹。 Debbie 使用 msdyn_SaveCalendar API。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-15T09:00:00.000Z\",\"EndTime\":\"2021-05-15T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}]}]}"
}

响应

{
  "InnerCalendarIds": "[\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"]"
}

编辑工作时间事件。

然后,Bob 的日程安排更改为 2021 年 5 月 15 日上午 10:00 开始。 Debbie 使用 msdyn_SaveCalendar API。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"IsEdit\":\"true\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-15T10:00:00.000Z\",\"EndTime\":\"2021-05-15T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}], \"InnerCalendarId\":\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"}]}"
}

响应

{
  "InnerCalendarIds": "[\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"]"
}

删除工作时间事件。

家庭紧急情况出现,鲍勃需要取消一整天的工作。 Debbie 使用 msdyn_DeleteCalendar API。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"InnerCalendarId\":\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"}"
}

响应

{
  "InnerCalendarIds": "[\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"]"
}

创建每日重复周期的工作时间

从 2021 年 5 月 20 日开始,Bob 决定从上午 8:00 到下午 5:00 与 Contoso 合作,并将在 2021 年 7 月 15 日停止在那里工作。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RecurrenceEndDate\":\"2021-07-15T00:00:00.000Z\",\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-20T08:00:00.000Z\",\"EndTime\":\"2021-05-20T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA\"}]}"
}

响应

{
  "InnerCalendarIds": "[\"20f6cfa7-cfbe-eb11-a81d-000d3a6e4359\"]"
}

编辑增加容量的工作小时每日重复周期

鲍勃决定在 2021 年 6 月 15 日的整个星期停止工作以休息一下。 在那之前,鲍勃将继续之前商定的全周时间表。 Debbie 使用 API 进行 msdyn_SaveCalendar 这些更改。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RecurrenceEndDate\":\"2021-06-15T00:00:00.000Z\",\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-20T08:00:00.000Z\",\"EndTime\":\"2021-05-20T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"InnerCalendarId\":\"20f6cfa7-cfbe-eb11-a81d-000d3a6e4359\",\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA\"}]}"
}

响应

{
  "InnerCalendarIds": "[\"867a2461-cdbe-eb11-a81d-000d3a6e4359\"]"
}

创建每周重复周期的工作时间

从 2021 年 6 月 16 日开始,Bob 将在周三和周五的上午 8:00 至下午 5:00 工作,午餐时间为中午 12:00 至中午 12:30。 Debbie 使用 msdyn_SaveCalendar API,但犯了一个错误,并将休息时间安排在中午 12:00 到下午 1:00。

请求

{
  "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-06-16T08:00:00.000Z\",\"EndTime\":\"2021-06-16T12:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}, {\"StartTime\":\"2021-06-16T12:00:00.000Z\",\"EndTime\":\"2021-06-16T13:00:00.000Z\",\"Effort\":null,\"WorkHourType\":1}, {\"StartTime\":\"2021-06-16T13:00:00.000Z\",\"EndTime\":\"2021-06-16T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=WE,TH,FR\"}]}"
}

响应

{
  "InnerCalendarIds": "[\"1f894441-d0be-eb11-a81d-000d3a6e4359\"]"
}

编辑每周重复工作时间的休息时间

然后,Debbie 纠正了错误,并使用 API 将 msdyn_SaveCalendar 中断时间更改为从中午 12:00 到中午 12:30。

请求

{
  "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"IsEdit\":\"true\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-06-15T08:00:00.000Z\",\"EndTime\":\"2021-06-15T12:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}, {\"StartTime\":\"2021-06-15T12:00:00.000Z\",\"EndTime\":\"2021-06-15T12:30:00.000Z\",\"Effort\":null,\"WorkHourType\":1}, {\"StartTime\":\"2021-06-15T12:30:00.000Z\",\"EndTime\":\"2021-06-15T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"InnerCalendarId\":\"1f894441-d0be-eb11-a81d-000d3a6e4359\",\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=WE,TH,FR\"}]}"
}

响应

{
  "InnerCalendarIds": "[\"1f894441-d0be-eb11-a81d-000d3a6e4359\"]"
}

创建工作时间自定义定期

Tim 在周一上午 8:00 至下午 5:00 和周三上午 11:00 至下午 3:00 为 Contoso 工作。 Tim 于 2021 年 5 月 16 日开始为 Contoso 工作。 Debbie 使用 API 创建 msdyn_SaveCalendar Tim 的工作时间。

请求

{
"CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"IsVaried\":true,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-16T08:00:00.000Z\",\"EndTime\":\"2021-05-16T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":1,\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=MO\"},{\"Rules\":[{\"StartTime\":\"2021-05-16T11:00:00.000Z\",\"EndTime\":\"2021-05-16T15:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":1,\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=WE\"}]}"
}

响应

{
  "InnerCalendarIds": "[\"9fb8c199-d1be-eb11-a81d-000d3a6e4359\", \"a2b8c199-d1be-eb11-a81d-000d3a6e4359\"]"
}

编辑工作时间自定义定期

然后,Tim 的日程安排更改为周三下午 5:00 至晚上 8:00 以及周四上午 10:00 至中午 12:00 的工作时间。 星期一从蒂姆的日程安排中删除了。 Debbie 使用 API 来 msdyn_SaveCalendar 实现这一点。

请求

{
"CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"IsVaried\":true,\"IsEdit\":true,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-16T08:00:00.000Z\",\"EndTime\":\"2021-05-16T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":2,\"InnerCalendarId\":\"9fb8c199-d1be-eb11-a81d-000d3a6e4359\",\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=MO\"},{\"Rules\":[{\"StartTime\":\"2021-05-16T17:00:00.000Z\",\"EndTime\":\"2021-05-16T20:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":3,\"InnerCalendarId\":\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\",\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=WE\"}, {\"Rules\":[{\"StartTime\":\"2021-05-16T10:00:00.000Z\",\"EndTime\":\"2021-05-16T12:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":1,\"InnerCalendarId\":null,\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=TH\"}]}"
}

响应

{
  "InnerCalendarIds": "[\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\", \"942bda0f-d3be-eb11-a81d-000d3a6e4359\"]"
}

在重复周期中编辑工作时间出现

2021 年 5 月 26 日,蒂姆只能在下午 1:00 至晚上 7:00 工作。 Debbie 在这里使用 msdyn_SaveCalendar API。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-26T13:00:00.000Z\",\"EndTime\":\"2021-05-26T19:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}], \"InnerCalendarId\":\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\"}]}"
}

响应

{
  "InnerCalendarIds": "[\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\"]"
}

删除工作时间自定义定期

蒂姆决定离开公司,不得不删除他们的整个日程安排。 Debbie 在这里使用 msdyn_DeleteCalendar API。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"InnerCalendarId\":\"34d2210c-9fb6-eb11-a820-000d3afb1dba\",\"IsVaried\":true}"
}

响应

{
  "InnerCalendarIds": "[\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\", \"942bda0f-d3be-eb11-a81d-000d3a6e4359\"]"
}

创建休假

蒂姆将从 2021 年 6 月 9 日开始休假三天进行家庭度假。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"InnerCalendarDescription\":\"Family Vacation\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-06-15T00:00:00.000Z\",\"EndTime\":\"2021-06-17T00:00:00.000Z\",\"Effort\":1,\"WorkHourType\":3}]}]}"
}

响应

{
  "InnerCalendarIds": "[\"266c434e-d5be-eb11-a81d-000d3a6e4359\"]"
}

创建全天工作时间

蒂姆从 2021 年 5 月 20 日开始轮班 72 小时。 Debbie 使用 API 创建 msdyn_SaveCalendar Tim 的工作时间。

请求

{
 "CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-20T00:00:00.000Z\",\"EndTime\":\"2021-05-22T00:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}]}]}"
}

响应

{
  "InnerCalendarIds": "[\"6e160a8e-d5be-eb11-a81d-000d3a6e4359\"]"
}

FAQs

我收到错误,“StartTime 不能大于或等于 EndTime”。

确保不同日历规则的时间段没有重叠。 检查日期以确保 StartTime 不晚于 EndTime。 此外,请验证时间是否遵循 24 小时格式。

API 是否可用于更新“工作时间模板”实体?

是的,除了资源工作时间之外,还可以使用此 API 创建和更新工作时间模板。

我收到错误“反序列化类型为 Microsoft.Dynamics.UCICalendar.Plugins.SaveCalendarContract+CalendarEventInfo 的对象时出错。 输入源的格式不正确。

期待状态“元素”.. 遇到名称为“”,命名空间为“的”文本“。

确保正确解析字符串。 可能缺少括号、逗号或分号。

我收到错误“无效的重复模式。 有关支持的模式,请参阅文档。

我们目前仅支持以下模式: FREQ=DAILY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SABYDAY 可以更改以包含更少的天数;但是, FREQ 并且 INTERVAL 无法更改。 确保图案中没有空格。

如何获取资源的 CalendarId 和 InnerCalendarId 的信息?

可以从资源属性中检索。CalendarId 拨打此电话以获取以下信息: [org-url]/api/data/v9.1/bookableresources([bookableresourceGUID])

上一个调用的一个示例是 [org-url]/api/data/v9.1/bookableresources(7bb0224b-6712-ec11-94f9-000d3a6d888e)

可以从日历属性中检索。InnerCalendarId 拨打此电话以获取以下信息: [org-url]/api/data/v9.1/calendars([calendar-id-from-above-call])?$expand=calendar_calendar_rules

上一个调用的一个示例是 [org-url]/api/data/v9.1/calendars(02481736-1b6a-4d49-9ebd-a5bd041c1c99)?$expand=calendar_calendar_rules

如果规则重叠怎么办?

规则分为几个不同的等级:

  • 等级 1 - 每日发生(工作/非工作)和休假发生。
  • 等级 0 - 每周复发(工作/非工作)。

V2 重叠规则

  • 等级 1 规则的优先级高于等级 0 规则。 如果同一天有两个规则(每个等级一个),则每日发生或补休发生优先于每周重复发生。
  • 当同一日期跨度内有多个 Rank 0 规则时:
    • 如果时间不相交,它们都会保留在日历上。
    • 如果时间相交,则最近创建/修改的规则是资源日历中考虑的规则。 删除日期范围中的所有其他相交规则。 如果某些等级 0 规则在某些日期有交集,但在其他日期没有交集,则该规则将被拼接以保留不相交的部分,同时删除相交部分。

V2 日历行为示例:

示例 1 - 重复工作时间:日期重叠,没有重叠的日期/时间

对于给定的日期跨度,技术人员在不同的日子里上早班、下午班或夜班工作。

  1. 为给定日期范围创建第一个重复日历规则。 例如: 重复周一、周二;1.1-4.1;东部时间上午 8 点至下午 5 点

  2. 为相交的日期范围创建第二个重复日历规则,同时确保工作时间不与前几天或之前的时间相交。 例如: 重复周三、周四、1.1-4.1;美国东部时间上午 8 点至下午 5 点或 重复周一、周二、1.1-4.1;美国东部时间下午 5 点至晚上 8 点

结果:两个日历规则保持不变并并存。

示例 2 - 重复工作时间:一些重叠的日期,所有重叠的日期和第二个规则在第一个规则之前或之后开始/结束

技术人员获得新的工作时间表,该时间表取代了他们旧时间表的几周。 根据合同,他们每周总是在同一天工作。

  1. 为给定日期范围创建第一个重复日历规则。 例如: 重复周一、周二;2.1-4.1;东部时间上午 8 点至下午 5 点

  2. 为重叠的日期范围创建第二个重复日历规则,其中所有日期都有重叠的工作时间。 为这个新规则选择在第一个规则的开始/结束日期之前或之后的开始/结束日期。 例如: 重复周一、周二;3.1-5.1;东部时间下午 1 点至晚上 8 点

结果:第一个规则被截断以适应第二个规则的开始/结束日期。 例如: 重复周一、周二、2.1-2.28、美国东部时间上午 8 点至下午 5 点重复周一、周二、3.1-5.1、美国东部时间下午 1 点至晚上 8 点

示例 3 - 重复工作时间:所有重叠的日期,有一些重叠的日期/时间

技术人员是固定期限为 2 个月的合同工。 他们已同意在某些日子承担额外的工作。 他们希望将周二的工作时间转移到更早/更晚的时间。

  1. 为给定日期范围创建一些重复的日历规则。 例如: 重复周一、周二;2.1-4.1;美国东部时间上午 8 点至中午 12 点,以及 重复周二、周三;2.1-4.1、东部时间下午 1 点至下午 5 点

  2. 为同一日期范围创建新的重复日历规则。 选择与原始规则部分重叠的日期/时间。 例如: 重复周二、周四;2.1-4.1;东部时间上午 10 点至下午 2 点

结果:新规则覆盖旧规则(存在重叠)的规则,而其他规则保持不变。 例如: 重复周一;2.1-4.1;美国东部时间上午 8 点至中午 12 点重复周三;2.1-4.1;美国东部时间下午 1 点至下午 5 点 ,并 重复周二、周四;2.1-4.1;美国东部时间上午 10 点至下午 2 点。

示例 4 - 重复工作时间:旧规则中包含的新规则日期,某些日期/时间重叠

技术人员每周上午 8 点至下午 5 点工作,Mon-Fri。 仅仅两周,他们将 Mon-Wed 处理一个特殊的紧急项目,工作时间不同,早上 6 点至下午 6 点。

  1. 为给定日期范围创建第一个重复日历规则。 例如: 重复周一、周二、周三、周四、周五;1.1-无结束日期;美国东部时间上午 8 点至下午 5 点

  2. 创建包含在上述日期范围内的第二个重复日历规则,选择某些日期重叠的工作时间。 例如: 重复周一、周二、周三;5.1-5.14;东部时间上午 6 点至下午 6 点

结果:在本练习结束时,日历应有四个重复规则:

  • 将第一个规则截断为第二个规则的开始日期
  • 第二个日历规则
  • 创建一个与第一个规则类似的新规则,但使用第二个规则的日期用于不重叠的日期
  • 截断第一个规则,从第二个规则的结束日期开始,没有结束日期

例如: 重复周一、周二、周三、周四、周五;1.1-4.30;美国东部时间上午 8 点至下午 5 点,重复 周一、周二、周三;5.1-5.14;美国东部时间上午 6 点至下午 6 点,重复周四、周五、5.1-5.14;美国东部时间上午 8 点至下午 5 点, 周一 、周二、周三、周四、周五重复;5.15 - 无结束日期;美国东部时间上午 8 点至下午 5 点

示例 5 - 非重复工作时间(发生次数,等级 1 规则)

技术人员有多个团队凝聚日,这些日优先于当天的所有其他工作时间实例。

  1. 为给定日期范围创建重复日历规则。 例如: 重复周一、周二、周三、周四、周五;1.1-无结束日期;美国东部时间上午 8 点至下午 5 点

  2. 创建包含在上述日期范围内的不重复日历规则。 选择与某些日期重叠的工作时间。 例如: 非重复;6.21;美国东部时间上午 7 点至下午 1 点

结果:到练习结束时,日历应有 1 个不重复的规则(出现)。 非重复规则将覆盖全天的重叠重复事件。 例如: 重复周一、周二、周三、周四、周五;1.1-6.21 外无结束日期;不重复;6.21;美国东部时间上午 7 点至下午 1 点

V1 重叠规则

  • 等级 1 规则的优先级高于等级 0 规则。 因此,如果同一天有两个规则(每个等级一个),则每日发生或补休发生优先于每周重复发生。
  • 如果有两个相同等级的规则,则最近创建/修改的规则将是资源日历中考虑的规则。
  • 请记住,全天发生的事件属于 1 级,因此您可能需要考虑将其更改为每周重复,以便能够添加发生工作时间并得到尊重。
  • 当工作时间存在并且创建了与其重叠的休假事件时,规则将以一种确保遵守休假的方式拆分,并且任何剩余时间作为工作时间将保持原样。 例如,如果 9 月 21 日上午 8 点至下午 5 点的工作时间,并且在 9 月 21 日下午 3 点至晚上 7 点添加了补休事件,则这将解析为工作时间为晚上 8 点至下午 3 点,休假时间为下午 3 点至晚上 7 点。 但是,如果规则的创建顺序相反(先创建休假,然后创建工作时间),则无论时间隙如何,都只会重新选择工作时间。 休假将被覆盖。

时区代码

Enum 时区
0 (格林威治标准时间-12:00)国际换日线西
1 (格林威治标准时间+13:00)萨摩亚
2 (格林威治标准时间-10:00)夏威夷
3 (格林威治标准时间-09:00)阿拉斯加州
4 (格林威治标准时间-08:00)太平洋时间(美国和加拿大)
5 (格林威治标准时间-08:00)下加利福尼亚州
6 (格林威治标准时间-11:00)协调世界时-11
7 (格林威治标准时间-10:00)阿留申群岛
8 (格林威治标准时间-09:30)马克萨斯群岛
9 (格林威治标准时间-09:00)协调世界时-09
10 (格林威治标准时间-07:00)山区时间(美国和加拿大)
11 (格林威治标准时间-08:00)协调世界时-08
12 (格林威治标准时间-07:00)奇娃娃、拉巴斯、马萨特兰
15 (格林威治标准时间-07:00)亚利桑那州
20 (格林威治标准时间-06:00)中部时间(美国和加拿大)
二十五 (格林威治标准时间-06:00)萨斯喀彻温省
二十九 (格林威治标准时间-06:00)瓜达拉哈拉、墨西哥城、蒙特雷
33 (格林威治标准时间-06:00)中美洲
34 (格林威治标准时间-06:00)复活节岛
35 (格林威治标准时间 05:00)东部时间(美国和加拿大)
40 (格林威治标准时间 05:00)印第安纳州(东部)
43 (格林威治标准时间 05:00)海地
44 (格林威治标准时间 05:00)哈瓦那
45 (格林威治标准时间 05:00)波哥大、利马、基多、里奥布兰科
47 (格林威治标准时间 04:00)加拉加斯
50 (格林威治标准时间 04:00)大西洋时间(加拿大)
51 (格林威治标准时间 05:00)特克斯和凯科斯群岛
55 (格林威治标准时间 04:00)乔治敦, 拉巴斯, 圣胡安
56 (格林威治标准时间 04:00)圣地亚哥
58 (格林威治标准时间 04:00)库亚巴
59 (格林威治标准时间 04:00)亚松森
60 (格林威治标准时间 03:30)纽芬兰
65 (格林威治标准时间 03:00)巴西利亚
69 (格林威治标准时间 03:00)布宜诺斯艾利斯
70 (格林威治标准时间 03:00)Cayenne, 福塔雷萨
71 (格林威治标准时间 03:00)萨尔瓦多
72 (格林威治标准时间 03:00)圣皮埃尔和密克隆群岛
73 (格林威治标准时间 03:00)格陵兰
74 (格林威治标准时间 03:00)蒙得维的亚
75 (格林威治标准时间 02:00) Mid-Atlantic
76 (格林威治标准时间 02:00)协调世界时-02
77 (格林威治标准时间 03:00)阿拉瓜伊纳
80 (格林威治标准时间 01:00)亚述尔群岛
83 (格林威治标准时间 01:00)佛得角是。
84 (格林威治标准时间+01:00)卡萨布兰卡
85 (格林威治标准时间+00:00)都柏林、爱丁堡、里斯本、伦敦
90 (格林威治标准时间+00:00)蒙罗维亚, 雷克雅未克
92 (格林威治标准时间)协调世界时
95 (格林威治标准时间+01:00)贝尔格莱德、布拉迪斯拉发、布达佩斯、卢布尔雅那、布拉格
100 (格林威治标准时间+01:00)萨拉热窝、斯科普里、华沙、萨格勒布
105 (格林威治标准时间+01:00)布鲁塞尔、哥本哈根、马德里、巴黎
110 (格林威治标准时间+01:00)阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳
113 (格林威治标准时间+01:00)中西部非洲
115 (格林威治标准时间+02:00)基希讷乌
120 (格林威治标准时间+02:00)开罗
125 (格林威治标准时间+02:00)赫尔辛基、基辅、里加、索非亚、塔林、维尔纽斯
129 (格林威治标准时间+02:00)安曼
130 (格林威治标准时间+02:00)雅典, 布加勒斯特
131 (格林威治标准时间+02:00)贝鲁特
133 (格林威治标准时间+02:00)大马士革
134 (格林威治标准时间+03:00)伊斯坦布尔
135 (格林威治标准时间+02:00)耶路撒冷
140 (格林威治标准时间+02:00)Harare, 比勒陀利亚
141 (格林威治标准时间+02:00)温得和克
142 (格林威治标准时间+02:00)加沙、希伯伦
145 (格林威治标准时间+03:00)莫斯科, 圣彼得堡
150 (格林威治标准时间+03:00)科威特, 利雅得
151 (格林威治标准时间+03:00)明斯克
155 (格林威治标准时间+03:00)内罗毕
158 (格林威治标准时间+03:00)巴格达
159 (格林威治标准时间+02:00)加里宁格勒
160 (格林威治标准时间+03:30)德黑兰
165 (格林威治标准时间+04:00)阿布扎比, 马斯喀特
169 (格林威治标准时间+04:00)巴库
170 (格林威治标准时间+04:00)埃里温
172 (格林威治标准时间+04:00)路易港
173 (格林威治标准时间+04:00)第比利斯
174 (格林威治标准时间+04:00)伊热夫斯克,萨马拉
175 (格林威治标准时间+04:30)喀布尔
176 (格林威治标准时间+04:00)阿斯特拉罕,乌里扬诺夫斯克
180 (格林威治标准时间+05:00)叶卡捷琳堡
184 (格林威治标准时间+05:00)伊斯兰堡、卡拉奇
185 (格林威治标准时间+05:00)托什干
190 (格林威治标准时间+05:30)钦奈、加尔各答、孟买、新德里
193 (格林威治标准时间+05:45)加德满都
195 (格林威治标准时间+06:00)阿斯塔纳
196 (格林威治标准时间+06:00)达卡
197 (格林威治标准时间+06:00)鄂木斯克
200 (格林威治标准时间+05:30)斯里·贾亚瓦德内普拉
201 (格林威治标准时间+07:00)新西伯利亚
203 (格林威治标准时间+06:30)仰光(仰光)
205 (格林威治标准时间+07:00)曼谷、河内、雅加达
207 (格林威治标准时间+07:00)克拉斯诺亚尔斯克
208 (格林威治标准时间+07:00)巴尔瑙尔,Gorno-Altaysk
209 (格林威治标准时间+07:00)霍夫德
210 (格林威治标准时间+08:00)北京、重庆、香港、乌鲁木齐
211 (格林威治标准时间+07:00)托木斯克
215 (格林威治标准时间+08:00)新加坡吉隆坡
220 (格林威治标准时间+08:00)台北
225 (格林威治标准时间+08:00)珀 斯
227 (格林威治标准时间+08:00)伊尔库茨克
228 (格林威治标准时间+08:00)乌兰巴托
229 (格林威治标准时间+09:00)平壤
230 (格林威治标准时间+09:00)首尔
231 (格林威治标准时间+08:45)尤克拉
235 (格林威治标准时间+09:00)大阪、札幌、东京
240 (格林威治标准时间+09:00)雅库茨克
241 (格林威治标准时间+09:00)赤塔
245 (格林威治标准时间+09:30)达尔文
250 (格林威治标准时间+09:30)阿德莱德
255 (格林威治标准时间+10:00)堪培拉、墨尔本、悉尼
260 (格林威治标准时间+10:00)布里斯班
265 (格林威治标准时间+10:00)霍巴特
270 (格林威治标准时间+10:00)海参崴
274 (格林威治标准时间+10:30)豪勋爵岛
275 (格林威治标准时间+10:00)关岛, 莫尔兹比港
276 (格林威治标准时间+11:00)布干维尔岛
277 (格林威治标准时间+11:00)诺福克岛
278 (格林威治标准时间+11:00)库页岛
279 (格林威治标准时间+11:00)乔库尔达赫
280 (格林威治标准时间+11:00)所罗门群岛,新喀里多尼亚
281 (格林威治标准时间+11:00)马加丹
284 (格林威治标准时间+12:00)协调世界时+12
285 (格林威治标准时间+12:00)斐济
290 (格林威治标准时间+12:00)奥克兰, 惠灵顿
295 (格林威治标准时间+12:00)Anadyr, Petropavlovsk-Kamchatsky
299 (格林威治标准时间+12:45)查塔姆群岛
300 (格林威治标准时间+13:00)努库阿洛法
301 (格林威治标准时间 05:00)切图马尔
302 (UTC+02:00)喀土穆
303 (格林威治标准时间 03:00)蓬塔阿雷纳斯
304 (格林威治标准时间+04:00)伏尔加格勒
305 (格林威治标准时间-07:00)育 空