组织通常需要以编程方式在其资源的日历上创建、编辑或删除工作时间。 日历显示工作时间、休假和休息时间,这些时间决定了计划工作时资源的可用性。 这些资源必须在特定时区进行调度,可能会也可能不会观察到业务关闭,并且可以具有可变的容量。 有关在 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 | 否 | 此键包含 SystemUserId 或 ResourceId ,仅当与此调用关联的实体是 SystemUser 类型的可预订资源时才会传递。 这是在 “服务管理 ”选项卡上检查 OwnCalendar 权限所必需的。 |
| 使用V2 | Flag | 否 | 传递此标志将启用 V2 版本的工作时间日历,并具有增强的重叠规则逻辑,允许多次重复。 有关详细信息,请参阅 如果存在重叠规则会发生什么情况?。 |
规则和重复
| Name | 类型 | 必选 | Description |
|---|---|---|---|
| 规则 | 规则 | 是的 | 此键是一个数组,每个元素包含以下部分表中列出的多个属性。 数组的大小应至少为 1。 |
| RecurrencePattern | String | 否 | 此键特定于重复。 我们目前仅支持以下模式: FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA。
BYDAY 可以更改以包含更少的天数;但是, FREQ 并且 INTERVAL 无法更改。 |
| InnerCalendarId | GUID | 否 | 此键特定于编辑。 如果正在编辑规则,则需要在此处传递 InnerCalendarId 。 如果未传递 InnerCalendarId ,则 API 会创建一个新规则,即使 IsEdit 键设置为 true。 |
| Action | 整数 | 否 | 此键特定于自定义重复周期。 如果正在创建或编辑自定义定期,则应输入以下数字之一:
|
规则
| 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 的日期部分相同的日期。 唯一的例外是:
|
| 工作时间类型 | 整数 | 是的 | 此键包含与以下选项之一相对应的数字:
|
| 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。
- 打开需要在其中进行这些日历更改的浏览器和组织。
- 打开开发人员工具(在 Microsoft Edge 中选择 Ctrl+Shift+I ,在 Google Chrome 中选择 F12 )。
- 在控制台中,将 [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));
}
- 定义此函数后,您可以使用 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 中函数调用的 替换 action 为 msdyn_SaveCalendarmsdyn_DeleteCalendar或 ,并替换 data 为相关的 CalendarEventInfo。
另请参阅以下屏幕截图,了解 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,SA。
BYDAY 可以更改以包含更少的天数;但是, 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-4.1;东部时间上午 8 点至下午 5 点。
为相交的日期范围创建第二个重复日历规则,同时确保工作时间不与前几天或之前的时间相交。 例如: 重复周三、周四、1.1-4.1;美国东部时间上午 8 点至下午 5 点或 重复周一、周二、1.1-4.1;美国东部时间下午 5 点至晚上 8 点。
结果:两个日历规则保持不变并并存。
示例 2 - 重复工作时间:一些重叠的日期,所有重叠的日期和第二个规则在第一个规则之前或之后开始/结束
技术人员获得新的工作时间表,该时间表取代了他们旧时间表的几周。 根据合同,他们每周总是在同一天工作。
为给定日期范围创建第一个重复日历规则。 例如: 重复周一、周二;2.1-4.1;东部时间上午 8 点至下午 5 点。
为重叠的日期范围创建第二个重复日历规则,其中所有日期都有重叠的工作时间。 为这个新规则选择在第一个规则的开始/结束日期之前或之后的开始/结束日期。 例如: 重复周一、周二;3.1-5.1;东部时间下午 1 点至晚上 8 点。
结果:第一个规则被截断以适应第二个规则的开始/结束日期。 例如: 重复周一、周二、2.1-2.28、美国东部时间上午 8 点至下午 5 点 和 重复周一、周二、3.1-5.1、美国东部时间下午 1 点至晚上 8 点。
示例 3 - 重复工作时间:所有重叠的日期,有一些重叠的日期/时间
技术人员是固定期限为 2 个月的合同工。 他们已同意在某些日子承担额外的工作。 他们希望将周二的工作时间转移到更早/更晚的时间。
为给定日期范围创建一些重复的日历规则。 例如: 重复周一、周二;2.1-4.1;美国东部时间上午 8 点至中午 12 点,以及 重复周二、周三;2.1-4.1、东部时间下午 1 点至下午 5 点。
为同一日期范围创建新的重复日历规则。 选择与原始规则部分重叠的日期/时间。 例如: 重复周二、周四;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-无结束日期;美国东部时间上午 8 点至下午 5 点。
创建包含在上述日期范围内的第二个重复日历规则,选择某些日期重叠的工作时间。 例如: 重复周一、周二、周三;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-无结束日期;美国东部时间上午 8 点至下午 5 点。
创建包含在上述日期范围内的不重复日历规则。 选择与某些日期重叠的工作时间。 例如: 非重复;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)育 空 |