我的 Dynamics 365 ORG 中有多个 SLA。每个 SLA 都有不同的营业时间。
我有一个要求,需要以编程方式获取 SLA 中的营业时间详细信息(在插件/自定义工作流程中调用)。
我需要的详细信息是:
已尝试使用retrievemultiple和CRM消息,如QueryScheduleRequest和ExpandCalendarRequest,但到目前为止尚未设法获取所有详细信息。
您可以手动获取营业时间(日历)详细信息,但有很多步骤。我在下面粗略地概述了它们,但我建议您创建一个快速控制台应用程序来调试并逐步浏览实时可用的属性。
首先查询您想要的SLA。如果您有 ID,请使用:
var sla = service.Retrieve("sla", ID, new ColumnSet(new string[] { "businesshoursid" });
然后获取与 SLA 关联的营业时间 ID:
var businessHoursId = sla.GetAttributeValue<EntityReference>("businesshoursid").Id;
然后检索营业时间(日历)本身:
var calendar = service.Retrieve("calendar", businessHoursId, new ColumnSet(true));
一个日历可以有多个规则。使用以下方法检索它们:
var calendarRules = calendar.GetAttributeValue<EntityCollection>("calendarrules");
这些外部日历规则将具有您可以使用
查看的模式var firstRulePattern = calendarRules[0].GetAttributeValue<string>("pattern");
// FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR
但是要获取每天的工作时间,您需要内部日历。以第一条规则为例:
var innerCalendarId = calendarRules[0].GetAttributeValue<EntityReference>("innercalendarid").Id;
var innerCalendar = service.Retrieve("calendar", innerCalendarId, new ColumnSet(true);
var innnerCalendarRule = innerCalendar.GetAttributeValue<EntityCollection>("calendarrules").Entities.FirstOrDefault();
根据您的内在规则,记下属性
duration
和 offset
。这些值以分钟为单位,将为您提供每天的工作时间。
QuerySchedulerRequest 考虑到业务关闭,返回任何资源(用户、设备...等)的工作时间
// Retrieve the working hours of the current user.
QueryScheduleRequest scheduleRequest = new QueryScheduleRequest
{
ResourceId = userResponse.UserId,
Start = DateTime.Now,
End = DateTime.Today.AddDays(7),
TimeCodes = new TimeCode[] { TimeCode.Available }
};
QueryScheduleResponse scheduleResponse = (QueryScheduleResponse)service.Execute(scheduleRequest);
// Verify if some data is returned for the availability of the current user
if (scheduleResponse.TimeInfos.Length > 0)
{
Console.WriteLine("Successfully queried the working hours of the current user.");
}