Работа с календарем в Aspose.Tasks

Введение

Aspose.Tasks для .NET предоставляет мощные функции для работы с календарями, позволяющие разработчикам эффективно управлять расписаниями проектов и распределением ресурсов. В этом руководстве мы рассмотрим, как использовать Aspose.Tasks для взаимодействия с календарями, охватывая такие важные операции, как получение информации о календаре, определение рабочих недель, расчет рабочих часов и многое другое.

Предварительные условия

Прежде чем мы начнем, убедитесь, что у вас настроены следующие предварительные условия:

  • Базовое понимание языка программирования C#.
  • Установка Aspose.Tasks для .NET. Если он не установлен, загрузите его сздесь.
  • Знакомство с Visual Studio или любой другой предпочитаемой средой разработки .NET.

Импортировать пространства имен

Прежде чем приступить к кодированию, обязательно импортируйте необходимые пространства имен:

using Aspose.Tasks;
using System;

using Aspose.Tasks.Saving;

Теперь давайте разобьем каждый пример на несколько шагов в формате пошагового руководства:

Шаг 1. Получите информацию о календаре

Чтобы получить информацию календаря из проекта, выполните следующие действия:

public static void RetrieveCalendarInfo()
{
    var project = new Project(DataDir + "RetrieveCalendarInfo.mpp");

    // Получить информацию о календарях
    foreach (var calendar in project.Calendars)
    {
        if (calendar.Name == null)
        {
            continue;
        }

        Console.WriteLine("Calendar UID: " + calendar.Uid);
        Console.WriteLine("Calendar Name: " + calendar.Name);
    }
}

Объяснение:

  • Загрузите файл проекта.
  • Переберите каждый календарь в проекте.
  • Распечатайте UID и название каждого календаря.

Шаг 2. Прочтите информацию о рабочих неделях

Чтобы прочитать информацию о рабочих неделях из календаря, выполните следующие действия:

public static void ReadWorkWeeksInformation()
{
    var project = new Project(DataDir + "WorkWithWorkWeekCollection.mpp");
    var calendar = project.Calendars.GetByUid(1);

    foreach (var workWeek in calendar.WorkWeeks)
    {
        var name = workWeek.Name;
        var fromDate = workWeek.FromDate;
        var toDate = workWeek.ToDate;
        Console.WriteLine("Name: " + name);
        Console.WriteLine("From Date: " + fromDate);
        Console.WriteLine("To Date: " + toDate);

        foreach (var day in workWeek.WeekDays)
        {
            foreach (var workingTime in day.WorkingTimes)
            {
                Console.WriteLine(workingTime.From);
                Console.WriteLine(workingTime.To);
            }
        }
    }
}

Объяснение:

  • Загрузите файл проекта.
  • Получите календарь по UID.
  • Переберите каждую рабочую неделю в календаре.
  • Напечатайте имя, дату начала и окончания каждой рабочей недели.
  • Просматривайте рабочие дни и рабочее время в течение каждой недели.

Шаг 3. Прочтите свойства календаря

Чтобы прочитать свойства календарей проекта, выполните следующие действия:

public void ReadCalendarProps()
{
    var project = new Project(DataDir + "Project_GeneralCalendarProperties.xml");

    foreach (var calendar in project.Calendars)
    {
        if (calendar.Name == null)
        {
            continue;
        }

        Console.WriteLine("UID : " + calendar.Uid + " Name: " + calendar.Name);

        Console.Write("Base Calendar : ");
        Console.WriteLine(calendar.IsBaseCalendar ? "Self" : calendar.BaseCalendar.Name);

        foreach (var wd in calendar.WeekDays)
        {
            var ts = wd.GetWorkingTime();
            Console.WriteLine("Day Type: " + wd.DayType + " Hours: " + ts);
        }
    }
}

Объяснение:

  • Загрузите файл проекта.
  • Переберите каждый календарь в проекте.
  • Распечатайте UID, имя и укажите, является ли это базовым календарем.
  • Распечатайте рабочее время для каждого типа дня.

Шаг 4: Рассчитайте рабочее время

Чтобы рассчитать рабочее время для задачи, выполните следующие действия:

public void CalculateWorkHours()
{
    var project = new Project(DataDir + "CalculateWorkHours.mpp");
    var task = project.RootTask.Children.GetById(1);
    var taskCalendar = task.Get(Tsk.Calendar);
    var startDate = task.Get(Tsk.Start);
    var endDate = task.Get(Tsk.Finish);
    var resource = project.Resources.GetByUid(1);
    var resourceCalendar = resource.Get(Rsc.Calendar);
    TimeSpan timeSpan;
    double durationInMins = 0;
    var tempDate = startDate;

    while (tempDate < endDate)
    {
        if (taskCalendar.IsDayWorking(tempDate) && resourceCalendar.IsDayWorking(tempDate))
        {
            timeSpan = taskCalendar.GetWorkingHours(tempDate);
            durationInMins += timeSpan.TotalMinutes;
        }

        tempDate = tempDate.AddDays(1);
    }

    Console.WriteLine("Duration in Minutes = " + durationInMins);
}

Объяснение:

  • Загрузите файл проекта.
  • Получите подробную информацию о задаче, например календарь, дату начала и дату окончания.
  • Подсчитайте рабочее время, перебирая каждый день и проверяя, рабочий ли это день.
  • Подсчитайте общую продолжительность в минутах.

Шаг 5. Определите дни недели для календаря

Чтобы определить дни недели для календаря, выполните следующие действия:

public void DefineWeekdaysForCalendar()
{
    var project = new Project();
    var calendar = project.Calendars.Add("Calendar1");

    calendar.WeekDays.Add(WeekDay.CreateDefaultWorkingDay(DayType.Monday));
    calendar.WeekDays.Add(WeekDay.CreateDefaultWorkingDay(DayType.Tuesday));
    calendar.WeekDays.Add(WeekDay.CreateDefaultWorkingDay(DayType.Wednesday));
    calendar.WeekDays.Add(WeekDay.CreateDefaultWorkingDay(DayType.Thursday));
    calendar.WeekDays.Add(new WeekDay(DayType.Saturday));
    calendar.WeekDays.Add(new WeekDay(DayType.Sunday));

    var weekDay = new WeekDay(DayType.Friday);
    var workingTime = new WorkingTime(9, 12);
    var workingTime2 = new WorkingTime(13, 16);
    weekDay.WorkingTimes.Add(workingTime);
    weekDay.WorkingTimes.Add(workingTime2);
    weekDay.DayWorking = true;
    calendar.WeekDays.Add(weekDay);
}

Объяснение:

  • Создайте новый проект и календарь.
  • Добавьте рабочие дни по умолчанию (с понедельника по четверг) и пользовательское рабочее время для пятницы.
  • Установите субботу и воскресенье как нерабочие дни.

Шаг 6. Запишите обновленные данные календаря в MPP

Чтобы записать обновленные данные календаря в файл MPP, выполните следующие действия:

public void WriteUpdatedCalendarDataToMpp()
{
    try
    {
        var project = new Project(DataDir + "project_update_test.mpp");
        var calendar = project.Calendars.GetByName("Standard");

        Calendar.MakeStandardCalendar(calendar);
        calendar.Name = "Test calendar";
        var exception = new CalendarException();
        exception.Name = "Exception 1";
        exception.FromDate = DateTime.Now;
        exception.ToDate = DateTime.Now.AddDays(2);
        exception.DayWorking = true;

        exception.WorkingTimes.Add(new WorkingTime(9, 13));
        exception.WorkingTimes.Add(new WorkingTime(14, 19));
        exception.WorkingTimes.Add(new WorkingTime(20, 21));
        calendar.Exceptions.Add(exception);

        var exception2 = new CalendarException();
        exception.Name = "Exception 2";
        exception2.FromDate = DateTime.Now.AddDays(7);
        exception2.ToDate = exception2.FromDate;
        exception2.DayWorking = false;
        calendar.Exceptions.Add(exception2);

        project.Set(Prj.Calendar, calendar);

        project.Save(OutDir + "WriteUpdatedCalendarDataToMPP_out.mpp", SaveFileFormat.Mpp);
    }
    catch (NotSupportedException ex)
    {
        Console.WriteLine(ex.Message + "\nThis example will only work if you apply a valid Aspose License. You can purchase a full license or get a 30-day temporary license from [here](https://Purchase.aspose.com/temporary-license/).");
    }
}

Объяснение:

  • Загрузите файл проекта и получите стандартный календарь.
  • Измените данные календаря, такие как исключения и рабочее время.
  • Сохраните обновленный проект с измененными данными календаря.

Шаг 7. Рассчитайте дату завершения разделенной задачи

Чтобы рассчитать дату окончания разделенной задачи, выполните следующие действия:

public void CalculateSplitTaskFinishDate()
{
    var project = new Project(DataDir + "SplitTaskFinishDate.mpp");
    var task = project.RootTask.Children.GetByUid(4);
    var calendar = project.Get(Prj.Calendar);

    Console.WriteLine(
        "Start Date: " + task.Get(Tsk.Start).ToShortDateString() + "\n+ Duration 8 hours\nFinish Date: "
        + calendar.GetTaskFinishDateFromDuration(task, new TimeSpan(8, 0, 0)));
}

Объяснение:

  • Загрузите файл проекта и получите разделенную задачу.
  • Получите календарь проекта.
  • Рассчитайте дату окончания на основе заданной продолжительности.

Шаг 8. Получение исключений календаря

Чтобы получить информацию об исключениях календаря, выполните следующие действия:

public void RetrieveCalendarExceptions()
{
    var project = new Project(DataDir + "project_RetrieveExceptions_test.mpp");

    foreach (var calendar in project.Calendars)
    {
        foreach (var exception in calendar.Exceptions)
        {
            Console.WriteLine("From: " + exception.FromDate.ToShortDateString());
            Console.WriteLine("To: " + exception.ToDate.ToShortDateString());
        }
    }
}

Объяснение:

  • Загрузите файл проекта.
  • Переберите каждый календарь и его исключения.
  • Выведите даты начала и окончания каждого исключения.

Шаг 9: Получите базовый календарь ресурсов

Чтобы работать с базовым календарем календаря ресурса, выполните следующие действия:

public void GetBaseResourceCalendar()
{
    var project = new Project(DataDir + "ResourceCalendar.mpp");
    var resource = project.Resources.Add("Resource1");
    var calendar = project.Calendars.Add("Resource1");
    resource.Set(Rsc.Calendar, calendar);

    foreach (var rsc in project.Resources)
    {
        if (rsc.Get(Rsc.Name) != null)
        {
            Console.WriteLine(rsc.Get(Rsc.Calendar).BaseCalendar.Name);
        }
    }
}

Объяснение:

  • Загрузите файл проекта.
  • Добавьте ресурс и его календарь.
  • Распечатайте название базового календаря для всех ресурсов.

Шаг 10: Удалить календарь

Чтобы удалить календарь из проекта, выполните следующие действия:

public void DeleteCalendar()
{
    var project = new Project(DataDir + "BrokenCalendar.mpp");
    var calendar = project.Calendars.GetByName("Broken Calendar");
    calendar.Delete();
}

Объяснение:

  • Загрузите файл проекта.
  • Получить календарь по имени.
  • Удалить календарь.

Шаг 11: Узнайте дату окончания по началу и приступайте к работе

Чтобы рассчитать дату окончания по дате начала и работе, выполните следующие действия:

public void GetFinishDateByStartAndWork()
{
    var project = new Project(DataDir + "Blank2010.mpp");
    var calendar = project.Calendars.GetByName("Standard");
    var start = new DateTime(2017, 10, 26, 8, 0, 0);
    var work = project.GetWork(7);
    var finish = calendar.GetFinishDateByStartAndWork(start, work);
    Console.WriteLine("Task start date: " + start);
    Console.WriteLine("Task work: " + work);
    Console.WriteLine("Task finish date: " + finish);
}

Объяснение:

  • Загрузите файл проекта.
  • Возьмите стандартный календарь.
  • Определите дату начала и продолжительность работы.
  • Рассчитайте дату окончания на основе даты начала и работы.

Шаг 12. Начните следующий рабочий день

Чтобы начать следующий рабочий день с помощью календаря, выполните следующие действия:

public void GetNextWorking

DayStart()
{
    var project = new Project(DataDir + "Project1.mpp");
    var calendar = project.Calendars.GetByUid(1);
    var nextWorkingDayStart = calendar.GetNextWorkingDayStart(new DateTime(2020, 4, 10, 13, 0, 0));
    Console.WriteLine(nextWorkingDayStart);
}

Объяснение:

  • Загрузите файл проекта.
  • Получите календарь по UID.
  • Получите время начала следующего рабочего дня.

Шаг 13: Получите конец предыдущего рабочего дня

Чтобы получить конец предыдущего рабочего дня с помощью календаря, выполните следующие действия:

public void GetPreviousWorkingDayEnd()
{
    var project = new Project(DataDir + "Project1.mpp");
    var calendar = project.Calendars.GetByUid(1);
    var previousWorkingDayEnd = calendar.GetPreviousWorkingDayEnd(new DateTime(2020, 4, 10, 13, 0, 0));
    Console.WriteLine(previousWorkingDayEnd);
}

Объяснение:

  • Загрузите файл проекта.
  • Получите календарь по UID.
  • Получите время окончания предыдущего рабочего дня.

Шаг 14: Получите дату начала от окончания и продолжительности

Чтобы получить дату начала по дате окончания и продолжительности, выполните следующие действия:

public void GetStartDateFromFinishAndDuration()
{
    var project = new Project(DataDir + "Project1.mpp");
    var calendar = project.Calendars.GetByUid(1);
    var startDate = calendar.GetStartDateFromFinishAndDuration(new DateTime(2020, 4, 10, 9, 0, 0), project.GetDuration(16, TimeUnitType.Hour));
    Console.WriteLine(startDate);
}

Объяснение:

  • Загрузите файл проекта.
  • Получите календарь по UID.
  • Рассчитайте дату начала на основе даты окончания и продолжительности.

Шаг 15: Получите рабочее время

Чтобы получить рабочее время на определенную дату, выполните следующие действия:

public void GetWorkingHours()
{
    var project = new Project(DataDir + "Project1.mpp");
    var calendar = project.Calendars.GetByUid(1);
    var workingHours = calendar.GetWorkingHours(new DateTime(2020, 4, 10));
    Console.WriteLine(workingHours.Hours);
}

Объяснение:

  • Загрузите файл проекта.
  • Получите календарь по UID.
  • Получите рабочее время на указанную дату.

Шаг 16: Узнайте рабочее время

Чтобы получить рабочее время на конкретную дату, выполните следующие действия:

public void GetWorkingTimes()
{
    var project = new Project(DataDir + "Project1.mpp");
    var calendar = project.Calendars.GetByUid(1);
    var workingTimes = calendar.GetWorkingTimes(new DateTime(2020, 4, 8, 8, 0, 0));

    foreach (var workingTime in workingTimes)
    {
        Console.WriteLine("From: " + workingTime.From);
        Console.WriteLine("To: " + workingTime.To);
    }
}

Объяснение:

  • Загрузите файл проекта.
  • Получите календарь по UID.
  • Получите рабочее время на указанную дату.

Заключение

Работа с календарями в Aspose.Tasks для .NET имеет решающее значение для эффективного управления расписаниями проектов. С помощью предоставленных примеров и пошаговых руководств вы можете легко манипулировать данными календаря, рассчитывать длительность задач и эффективно обрабатывать исключения. Интегрируя эти функции в свои приложения, вы можете оптимизировать процессы управления проектами и обеспечить точное планирование.

Часто задаваемые вопросы

Вопрос 1: Нужна ли мне лицензия для использования Aspose.Tasks для .NET?

О1: Да, вам нужна действующая лицензия для использования Aspose.Tasks для .NET в ваших приложениях. Вы можете приобрести полную лицензию или получить 30-дневную временную лицензию на сайтездесь.

Вопрос 2. Могу ли я программно изменить исключения календаря?

О2: Да, вы можете программно добавлять, обновлять или удалять исключения календаря с помощью Aspose.Tasks для API .NET.

Вопрос 3. Как рассчитать даты завершения задач с настраиваемой длительностью?

A3: Aspose.Tasks для .NET предоставляет такие методы, какGetTaskFinishDateFromDuration() для расчета дат окончания задач на основе настраиваемой длительности.

Вопрос 4. Можно ли создавать собственные календари, например календари ночных смен?

О4: Да, вы можете создавать собственные календари, например календари ночных смен, используя Aspose.Tasks для API .NET.

Вопрос 5. Могу ли я получить информацию об исключениях календаря из файлов проекта?

О5: Да, вы можете легко получить информацию об исключениях календаря из файлов проекта, используя Aspose.Tasks для .NET.