Настройка повторения задач в Планировщике (предварительная версия)
В этой статье описывается, как использовать повторение с задачами Планировщика для автоматизации создания повторяющихся задач. Свойство повторения задачи Планировщика позволяет пользователям автоматизировать создание будущих задач, представляющих реальные задачи, которые необходимо выполнять повторно.
Пользовательские сценарии
Поддерживаются следующие сценарии:
Добавьте поведение повторения в существующую задачу, создавая таким образом повторяющийся ряд. Кроме того, создайте новую задачу с заданным повторением. Конечный результат для обоих вариантов одинаков: повторяющаяся задача, первая в повторяющемся ряде. Пользователи указывают расписание повторения.
Измените расписание повторения для существующего повторяющегося ряда.
Продолжайте серию. Маркировка завершенной задачи приводит к порождению новой задачи, чтобы продолжить серию в соответствии с расписанием повторения. Если активная задача в ряду удаляется, пользователю должно быть предложено определить, хотите ли он продолжить или завершить ряд. Если клиент не знает о повторении и не предлагает запрос, следует продолжить серию. Его не следует прерывать случайно.
Завершите ряд следующими ами:
- Удаление активной задачи из ряда (и выбор да , чтобы завершить ряд).
- Прекращение ряда без удаления активной задачи.
Возродить серию. Если повторение было завершено, необходимо восстановить ряд.
Концептуальные различия между повторяющимися собраниями и повторяющимися задачами
В этом разделе описывается реальный сценарий для повторяющихся задач, чтобы проиллюстрировать интересные различия между повторяющимися собраниями и повторяющимися задачами, а также исследовать проблемное пространство изменений в шаблоне повторения.
В следующем примере показан отчет, который должен регулярно заполняться и использует повторяющуюся задачу для отслеживания завершения отчета.
Отчет и связанная с ним задача предоставляются каждые 2 недели в пятницу; серия началась 14 мая 2021 года. Первый доклад ожидается в эту дату, пятницу, 14 мая. Перемежем до 7 января 2022 г., через 34 недели. Человек, который делал отчеты, взял некоторое время отгула в декабре, и никто не завершил отчеты. Текущая повторяющаяся задача (и соответствующий отчет) должна состояться 10 декабря. Отчет и связанная с ним задача просрочены на 4 недели.
Заметка: На этом этапе контраст между повторяющимися собраниями и событиями становится очевидным. Собрания не обязательно должны быть помечены как завершенные , чтобы автоматизированная система запланирует следующее собрание в календаре. Выполнение просроченной задачи может привести к созданию другой задачи, которая должна быть поставлена в прошлом, но нет концепции завершения собрания в прошлом. Следующий экземпляр собрания всегда находится в будущем на основе сегодняшней даты. Сегодняшняя дата не используется для расчета дат выполнения повторяющихся задач, чтобы избежать потери отслеживания просроченных работ.
Если расписание повторения не изменено и задача 10 декабря помечена как завершенная, то для следующей задачи для серии создается экземпляр с датой выполнения 24 декабря.
Однако предположим, что принято решение о том, что в будущем этот доклад следует делать каждые 3 недели, а не каждые 2 недели. Решение может даже заключаться в том, что 3-недельная периодичность должна быть ретроактивной для просроченных отчетов. Это изменение предлагает различные возможные варианты определения продолжения ряда:
- Следует ли изменить дату 10 декабря?
- Когда должна быть поставлена следующая задача?
Ниже приведено текущее состояние повторяющейся задачи и решение.
- Текущая задача имеет дату выполнения — 10 декабря 2021 г.
- Предыдущая задача должна была быть выполнена 26 ноября 2021 г.
- Принимается решение изменить периодичность с 2 недель на 3 недели; изменение применяется задним числом к просроченной отчетности.
Учитывая контекст, возможны два варианта, и оба являются допустимыми историями клиентов о том, как можно изменить серию в соответствии с новой 3-недельной периодичностью.
Вариант 1. Измените задачу 10 декабря, чтобы она была просрочена через 3 недели после предыдущей задачи 26 ноября. Срок выполнения текущей задачи изменен на 17 декабря, а следующая задача — 7 января.
Вариант 2. Сохраните текущую дату выполнения 10 декабря и измените периодичность для следующей задачи, которая должна быть запланирована на 31 декабря.
Планировщик поддерживает оба этих варианта. Сегодняшняя дата не учитывает, как обрабатываются эти различные случаи. Этот пример рассматривается далее в примере 1. Изменение шаблона с помощью и без изменений в patternStartDateTime.
Определения
Для обсуждения и описания задач Планировщика с повторением используются следующие термины:
Определение задачи с активным повторением
Если выполняются следующие три условия, plannerTask имеет активное повторение:
- Свойство percentComplete имеет значение меньше
100
. -
recurrence.nextInSeriesTaskId имеет
null
значение или undefined. - recurrence.schedule содержит допустимый plannerRecurrenceSchedule с значением nextOccurrenceDateTime, не имеющим значения NULL.
Задача с активным повторением (назовите ее задачей A) может активировать механизм повторения службы, которая создает новую задачу (задачу Б) для продолжения повторяющегося ряда. В этом случае задача A имеет значение recurrence.nextInSeriesTaskId , для которого задан идентификатор задачи B. Так как задача A больше не соответствует условию 2, она больше не имеет активного повторения. Задача A никогда не может иметь активное повторение , так как nextInSeriesTaskId является свойством только для чтения, и служба никогда не удаляет его значение.
Определение ряда повторений
Ряд повторений (также известный как повторяющийся ряд) — это последовательный ряд задач. Серия начинается при первом определении повторения для одной задачи и продолжается автоматическое создание новых задач с тем же идентификатором recurrence.seriesId.
- Задачи, совместно использующие один и тот же параметр recurrence.seriesId , относятся к одному и тому же ряду повторений.
- Каждая задача в серии имеет отдельный идентификатор recurrence.occurenceId.
- Первая задача в серии имеет значение occurrenceId
1
. - Если первая задача активируется механизмом повторения (помечается как завершенная или удаленная, а она имеет активное повторение), то вторая задача создается с идентификатором occurenceId .
2
Этот процесс продолжается до тех пор, пока ряд повторений не завершится.
Избегание неоднозначного термина повторяющейся задачи
В обычной речи термин повторяющаяся задача иногда относится к уникальной задаче с активным повторением в ряде; и иногда ссылается на сам ряд повторений или все задачи в цикле повторений. Эта неоднозначность распространена в устном английском языке: точно так же еженедельный отчет может ссылаться на один экземпляр отчета или на повторяющуюся ответственность за выполнение отчета каждую неделю. Из-за этой неоднозначности использование термина "повторяющаяся задача " избегается; Вместо этого предпочтителен один из следующих терминов: задача с активным повторением или ряд повторений.
Сведения о типе ресурса
При работе с повторением для задач Планировщика используется множество типов ресурсов: plannerTaskRecurrence, plannerRecurrenceSchedule и recurrencePattern. В следующих разделах содержатся дополнительные сведения о двух последних типах ресурсов.
plannerRecurrenceSchedule
PlannerRecurrenceSchedule инкапсулирует определение шаблона повторения (pattern), начальную дату для этого шаблона (patternStartDateTime) и созданное системой свойство, указывающее дату следующего вхождения (nextOccurrenceDateTime).
Шаблон является повторениемPattern; Дополнительные сведения см. в примечаниях, относящихся к планировщику, о повторенииPattern.
ШаблонStartDateTime указывает начальную дату и время ряда в качестве значения DateTimeOffset. Значение, отличное от NULL, должно присваиваться patternStartDateTime всякий раз, когда используется свойство pattern ; В настоящее время это единственный способ определения повторения. Клиенты, как правило, должны переназначить это значение, когда они вносят изменения в recurrence.schedule.pattern , чтобы указать дату начала нового шаблона; Однако если клиенты не включают значение, служба продолжает серию, используя значение по умолчанию, основанное на расписании. Дополнительные сведения см. в следующих примечаниях и пояснениях.
NextOccurrenceDateTime — это созданное системой поле только для чтения. Он предоставляет вычисляемую службу дату, которая используется в качестве dueDateTime для следующего plannerTask в серии. NextOccurrenceDateTime вычисляется на основе шаблона вместе с patternStartDateTime или значением привязки, которое отслеживает первоначально запланированную дату заданной задачи.
Заметка: Планировщик в настоящее время не использует тип ресурса recurrenceRange .
Заметки, относящиеся к планировщику, о повторенииPattern
Ниже приведены ограничения, относящиеся к Планировщику, для recurrencePattern:
-
relativeMonthly
иrelativeYearly
шаблоны могут не указывать более одного дня для daysOfWeek. - Для
weekly
шаблонов, если daysOfWeek содержит более одного дня, интервал должен иметь значение1
.
Пояснения по поводу повторенияPattern:
При изменении любого свойства в файле recurrencePattern необходимо указать все соответствующие свойства шаблона. Например, шаблон с типом =
daily
и интервалом =1
не может быть исправлен только с интервалом =2
400 Bad Request
; в противном случае служба возвращает код ответа. Также необходимо указать свойство type =daily
, даже если тип не меняется. Это нормальное поведение для типа ресурса recurrencePattern , хотя некоторые другие свойства Планировщика работают иначе.Неиспользуемые свойства автоматически присваиваются значению по умолчанию.
- Например, свойство month используется только для годовых шаблонов с допустимыми значениями от
1
до12
.daily
Однако шаблоны ,weekly
иmonthly
назначены0
свойству month, так как0
является значением по умолчанию для целочисленного значения. - Свойства перечисления, включая firstDayOfWeek и index, получают значения по умолчанию, соответствующие первому значению перечисления:
sunday
иfirst
соответственно.
- Например, свойство month используется только для годовых шаблонов с допустимыми значениями от
Для
absoluteMonthly
шаблонов, если выбранный dayOfMonth не существует в конкретном месяце, заменяется последний день месяца.- Пример: если значение dayOfMonth — и
31
вы повторяете апрель, выбранная дата — 30 апреля. - Пример: если аргумент dayOfMonth имеет значение
29
,30
или31
и вы повторяете для февраля, выбранная дата — последний день февраля.
- Пример: если значение dayOfMonth — и
Аналогичным образом, для
absoluteYearly
шаблонов с месяцем =2
и днемOfMonth =29
выбранная дата в високосных годах — 28 февраля.Для
weekly
шаблонов свойство firstDayOfWeek используется для различения того, что рассматривается на этой неделе , и того, что будет рассматриваться на следующей неделе. Это актуально при измененииweekly
шаблона. Следующая задача запланирована на следующую неделю, а firstDayOfWeek определяет, когда начнется следующая неделя.
Примеры того, как firstDayOfWeek влияет на изменения еженедельного шаблона
Задана задача с активным повторением со следующими свойствами:
- Это происходит еженедельно каждую среду: шаблон имеет тип =
weekly
, интервал =1
, daysOfWeek = [wednesday
], и firstDayOfWeek =sunday
- DueDateTime — среда 2/2
- СледующийOccurrenceDateTime — среда 2/9
Возможны три изменения шаблона , а результирующий nextOccurrenceDateTime показан в следующей таблице.
Изменение шаблона | Результат nextOccurrenceDateTime |
---|---|
Еженедельно каждый вторник | Вторник 2/8 |
Еженедельно каждый четверг | Четверг 2/10 |
Еженедельно каждый четверг и firstDayOfWeek изменяется на четверг | Четверг 2/3 |
Обратите внимание на разницу четверг 2/10 против четверга 2/3. При firstDayOfWeek = Thursday
четверг 2/3 не в ту же неделю , что и среда 2/2, так как новая неделя начинается в четверг; если первый ДеньOfWeek не Thursday
является , то четверг 2/3 находится в той же неделе , что и среда 2/2, а четверг 2/10 — на следующей неделе.
Примечания о расписании и дате выполнения
DueDateTime может быть изменен клиентами, чтобы иметь другое значение (включая null
), не влияя на расписание и nextOccurrenceDateTime. Например, если задача опаздывает, а дата выполнения изменена в соответствии с этой задержкой, следующая задача в серии отображается как первоначально запланированная, если шаблон и (или) шаблонStartDateTime явно не обновлены. Таким образом, откладывание срока выполнения не приводит к пропуску дат в соответствии с заданным расписанием. Это отличается от модели собрания , где сегодняшняя дата играет роль при определении времени следующего собрания. Знание сегодняшней даты важно для вычисления даты следующего собрания или события, но оно не относится к расчету следующей даты выполнения задачи.
Пример 1. Изменение шаблона с помощью и без изменений в patternStartDateTime
Задана задача с активным повторением со следующими свойствами:
- Шаблон повторения указывает каждые 2 недели в пятницу, например тип =
weekly
, интервал =2
, daysOfWeek = [friday
], и firstDayOfWeek =sunday
. - Предыдущая задача должна была быть выполнена 26 ноября 2021 г.
- Текущая задача должна быть поставлена 10 декабря 2021 г.
- Следующий ПараметрOccurrenceDateTime — 24 декабря 2021 г. (через две недели после текущей даты выполнения).
Принимается решение изменить периодичность с 2 недель на 3 недели. Таким образом, шаблон изменяется, чтобы иметь интервал = 3
вместе с одинаковыми значениями для еженедельно по пятницам.
Рассматриваются три уникальные возможности, каждая из которых дает разные даты выполнения следующей задачи в серии:
Описание изменений | Результат nextOccurrenceDateTime |
---|---|
Измените шаблонStartDateTime на 10 декабря 2021 г. | 31 декабря 2021 г. |
Измените шаблонStartDateTime на 17 декабря 2021 г. | 7 января 2022 г. |
Не изменяйте шаблонStartDateTime | 31 декабря 2021 г. |
В первом примере параметр patternStartDateTime имеет то же значение, что и dueDateTime, например 10 декабря. Параметр nextOccurrenceDateTime имеет значение 3 недели после patternStartDateTime, то есть 31 декабря. Концептуально это изменение представляет собой изменение частоты, которое действует только для следующей задачи, а не для этой задачи.
Во втором примере параметр patternStartDateTime имеет значение 3 недели после 26 ноября, то есть 17 декабря. Опять же, параметр nextOccurrenceDateTime имеет значение 3 недели после шаблонаStartDateTime, на этот раз 7 января. Концептуально это изменение срока действия с 26 ноября (предыдущая задача), а не с 10 декабря (исходная дата выполнения текущей задачи).
Обычно рекомендуется изменить значение dueDateTime задачи, чтобы он совпадал с новым шаблономStartDateTime; однако это не обязательно. Если dueDateTime не изменяется вместе с шаблономStartDateTime во втором примере, пользователи по-прежнему видят дату выполнения текущей задачи 10 декабря. После ее завершения следующая задача в серии запланирована на 7 января. Так как это может привести к путанице для пользователей, рекомендуется совместно назначить dueDateTime и patternStartDateTime .
Третий пример аналогичен первому, за исключением того, что в нем не указан шаблонStartDateTime.
ШаблонStartDateTime, который имеет длинную обратную сторону, например в августе, нельзя использовать. В этом случае значение nextOccurrenceDateTime вычисляется на основе исходной даты выполнения 10 декабря, что приводит к nextOccurrenceDateTime 31 декабря, аналогично первому примеру. Обратите внимание, что исходная дата выполнения не предоставляется, хотя она используется в этом вычислении. Это означает, что dueDateTime можно изменить на другое значение или даже изменить на null
значение , но значение dueDateTime игнорируется для этого вычисления, используя вместо него исходную дату выполнения. Это еще одна причина, по которой рекомендуется изменить dueDateTime и patternStartDateTime вместе.
Пример 2. Дата выполнения не влияет на следующее вхождение
Задана задача с активным повторением со следующими свойствами:
- Это происходит еженедельно каждую среду: шаблон имеет тип =
weekly
, интервал =1
, daysOfWeek = [wednesday
], и firstDayOfWeek =sunday
. - DueDateTime — ср 2/16.
- СледующийOccurrenceDateTime — СР 2/9.
- Исходная дата выполнения — среда 2/2. Это значение не является общедоступным, хотя его можно вывести из nextOccurrenceDateTime.
Ниже приводится изучение трех возможных изменений.
Изменение | Результат nextOccurrenceDateTime |
---|---|
Без изменений | Вторник 2/9 |
шаблон изменяется на еженедельный каждый четверг; нет изменений в шаблонеStartDateTime | Четверг 2/10 |
patternStartDateTime изменено на 2/9; нет изменений в шаблоне | Среда 2/16 |
Во всех трех примерах dueDateTime не изменяется с измененного значения среды 2/16, а следующая задача в серии создается с dueDateTime , равным nextOccurrenceDateTime в предыдущей таблице.
Примечание.
- Поведение по умолчанию, когда patternStartDateTime не переназначается явным образом, заключается в том, что расписание продолжается на основе исходной даты выполнения. В этом случае исходная дата выполнения — 2/2, а текущая дата dueDateTime — 16.02.
- Если шаблонStartDateTime изменен, nextOccurrenceDateTime пересчитывается с использованием этой новой даты начала.
- Если дата выполнения будет изменена на
null
2/16 или на любую другую дату в будущем или прошлом, предыдущие примеры не будут затронуты.
Сценарии разработчика
Создание повторяющейся серии
Recurrence.schedule — это единственное редактируемое клиентом подсредактируемое свойство повторения. Добавив recurrence.schedule (независимо от того, определен ли повторение уже), клиенты могут изменить неповторяющуюся задачу на задачу с активным повторением.
Два других условия, упомянутые в определении активного повторения , влияют на возможность добавления recurrence.schedule :
- Свойство percentComplete должно быть меньше
100
. - Свойство recurrence.nextInSeriesTaskId должно быть
null
или не назначено.
Другие вложенные свойства повторения доступны только для чтения. Если они еще не назначены, служба автоматически создает их при добавлении recurrence.schedule .
Повторение триггера
Ниже показано два способа запуска механизма повторения для задачи с активным повторением.
-
Обновите задачу и присвойте параметру
100
percentComplete значение (также называемое завершением задачи или пометкой задачи завершенной). - Удалите задачу.
В предыдущем определении для _task с активным повторением, если какое-либо из трех условий не выполняется, механизм повторения не активируется (новая задача не создается и nextInSeriesTaskId не назначается).)
Создание экземпляра новой задачи обычно происходит немедленно, что иногда приводит к задержке при создании новой задачи.
Новая задача имеет следующие свойства, скопированные из уже завершенной задачи: заголовок, описание, элементы контрольного списка (для неполных), назначения, приоритет и категории. Параметр percentComplete новой задачи имеет значение 0
.
DueDateTime новой задачи устанавливается в соответствии с расписанием повторения. Копируются следующие вложенные свойства повторения: seriesId, recurrenceStartDateTime и schedule; schedule.nextOccurrenceDateTime вычисляется для новой задачи. Другим свойствам повторения присваиваются соответствующие значения для новой задачи.
Обнаружение следующей задачи в серии
Если задача C имеет определенное повторение и пользователь помечает задачу C завершенной (percentComplete = 100
), то для продолжения ряда повторений создается задача D .
Задача C имеет свое свойство recurrence.nextInSeriesTaskId , заполненное идентификатором задачи D.
С другой стороны, если задача C удаляется, а удаление вызывает повторение, клиент должен обнаружить идентификатор задачи D другими способами. Например, запрашивая задачи в том же контейнере или потребляя разностный канал синхронизации.
Изменение повторяющегося ряда
Для задачи с активным повторением может быть изменено расписание повторения. Обратите внимание, что recurrence.schedule является единственным вложенным свойством повторения, которое можно изменить.
Например, для задачи с активным повторением и расписанием еженедельно каждую среду расписание может быть изменено на ежемесячное 15-е число каждого месяца.
Завершение повторяющегося ряда
Чтобы завершить повторяющийся ряд, присвойте свойству recurrence.schedule значение null
. Это можно сделать только в том случае, если параметр nextInSeriesTaskId или null
не назначен.
Возобновление повторения после завершения
После удаления recurrence.schedule можно добавить новое значение recurrence.schedule в задачу, которая восстанавливает серию.
Выполните предыдущие действия в разделе Создание повторяющегося ряда. Применяются те же ограничения. Исходный идентификатор recurrence.seriesId и другие вложенные свойства повторения не изменяются, фактически восстанавливая или продолжая исходный ряд.
Определение задачи с активным повторением в ряде повторений
С учетом параметра recurrence.seriesIdактивная повторение может иметь не более одной задачи с этим seriesId.
Завершенные задачи скрыты от большинства представлений. Пользователь редко просматривает задачу, которая помечена как завершенная. Удаленные задачи не могут быть просмотрированы. Это означает, что в большинстве случаев в ряде повторений существует только одна задача с активным повторением. Если задача с активным повторением деактивирована с помощью расписания, то задачи с активным повторением в этом ряду не существуют.
Редкие исключительные сценарии
Следующие сценарии являются редкими, хотя и возможными. Хотя они могут показаться клиенту исключениями, на самом деле служба всегда сохраняет целостность правила: не более одной задачи с активным повторением в заданном ряде повторений. Для дизамбига дано руководство.
Причины
Ниже показаны две возможные причины, по-видимому, не синхронизированные сведения.
Информация еще не достигла быстрого клиентского хранилища Планировщика. Достоверный источник информации Планировщика содержит данные, но данные еще не были реплицированы в оптимизированное для запросов хранилище, которое возвращает данные клиентам.
Механизм повторения столкнулся с временным сбоем. Это означает, что новая задача для продолжения ряда еще не создана. Обычно он создается в течение нескольких секунд или минут.
Две задачи с активным повторением в одной серии повторений
Если клиент наблюдает две задачи с активным повторением в одном и том же ряду повторений, можно предположить, что для задачи с меньшим значением occurrenceId уже активирован механизм повторения. Серверное хранилище Планировщика имеет следующий наборInSeriesTaskId , но эта информация еще не достигла быстрого клиентского хранилища. Задача с большим значением occurrenceId — это уникальная задача с активным повторением.
Задача с активным повторением имеет меньшее значение occurrenceId, чем другая в том же ряде повторений.
Как и в случае с предыдущими "двумя задачами с активным повторением", эта вторая ситуация может наблюдаться, если задача с большим параметром occurrenceId отключена (recurrence.schedule = null
). Существование задачи с большим значением occurrenceId подразумевает, что все задачи с меньшим значением occurrenceId в этом ряду не имеют активного повторения, даже если задача с большим значением occurrenceId не имеет активного повторения .
Ноль задач с активным повторением в ряде
Это действительно неоднозначная ситуация, так как может быть одно из следующих вариантов:
- Механизм повторения был отложен из-за временного сбоя; она будет повторна.
- Механизм повторения завершился успешно, но новая задача еще не добавлена в быстрое клиентское хранилище.
- Новая задача была создана, но затем она была удалена другим клиентом.
Первые два состояния — это временные состояния, которые гарантированно будут исправлены службой, как правило, в течение нескольких секунд или минут. Третий, как правило, является постоянным. Вероятно, неточно описать этот сценарий как редкий или исключительный; однако было описано ранее, чтобы привлечь внимание к тому факту, что наблюдается неоднозначность в наблюдаемом состоянии из-за возможности первых двух случаев.
Поиск всех задач в повторяющейся серии
Разработчики, работающие с Планировщиком, знакомы с существующим API, чтобы получить все задачи в плане. Планировщик пока не имеет API для получения всех задач в серии повторений; Однако, получив все задачи в плане, вы обычно можете получить все задачи в серии повторений.
Свойство recurrence.seriesId для каждого plannerTask — это идентификатор, который отличается от определенного повторяющегося ряда , к которому принадлежит одна или несколько задач. При назначении это значение никогда не может измениться.
Recurrence.occurrenceId — это целочисленное значение, указывающее порядок задач в ряду. Первой задаче в ряду (задаче, в которой впервые добавлено повторение) присваивается значение occurrenceId .1
Примечание.
- Если некоторые задачи в серии были удалены, индексы могут содержать пробелы.
- Если пользователи переместили повторяющийся ряд в другой план, необходимо просмотреть другие планы, чтобы увидеть другие задачи в серии. однако пользователей обычно интересуют в первую очередь повторяющиеся ряды в пределах одного плана. Задачи не могут перемещаться через границы групп; Если запрашиваются все планы в группе, можно найти все задачи, которые могли быть перенесены из исходного плана.
Примеры операций REST
Следующие запросы и ответы представляют упорядоченную последовательность операций. Их можно использовать в качестве тестовых случаев для клиентов, реализующих повторение задачи Планировщика, путем замены соответствующих идентификаторов (для задачи, плана, ряда повторений и т. д.). Многие случаи ошибок чередуются, чтобы проиллюстрировать неверные изменения в определенных состояниях.
Добавление даты выполнения и повторения в существующий планировщикTask
В следующем примере запроса и ответа показано, как повторяться с задачей. Задача с идентификатором Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV
уже существует и имеет повторение = null
. Чтобы добавить повторение, необходимо назначить необходимые свойства recurrence.schedule. Неиспользуемые свойства recurrencePattern (month, dayOfMonth, firstDayOFWeek и index) не следует включать.
Запрос
PATCH https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV
{
"recurrence": {
"schedule": {
"pattern": {
"type": "daily",
"interval": 2
},
"patternStartDateTime": "2021-11-13T10:30:00Z"
}
},
"dueDateTime": "2021-11-13T10:30:00Z"
}
Отклик
HTTP/1.1 204 NO CONTENT
Получение предыдущей задачи
В следующем примере запроса и ответа показано, как получить задачу с новым повторением.
Запрос
GET https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV
Отклик
Ниже приведены заметки об ответе:
- Неиспользуемым свойствам recurrencePattern (month, dayOfMonth, firstDayOFWeek и index) служба присваивает значения по умолчанию.
- NextOccurrenceDateTime вычисляется по расписанию. В этом случае patternStartDateTime — 13 ноября, и шаблон определяет каждый другой день; это дает значение nextOccurrenceDateTime через два дня после шаблонаStartDateTime, то есть 15 ноября.
-
SeriesId и occurrenceId создаются автоматически.
SeriesId — это новый GUID, закодированный в формате идентификатора Планировщика. Так как это первая задача в ряде, она получает значение occurrenceId .
1
-
Параметру recurrenceStartDateTime присваивается то же значение, что и patternStartDateTime. Это верно для первой задачи в ряду (occurrenceId =
1
). Однако для будущих задач в ряду значение recurrenceStartDateTime не меняется, даже если изменится шаблонStartDateTime . он отслеживает начало повторения, в отличие от изменений шаблона. - Параметр previousInSeriesTaskId всегда
null
имеет значение , так как это первая задача в серии (occurrenceId =1
). - NextInSeriesTaskId назначается, если и когда создается следующая задача для продолжения ряда.
HTTP/1.1 200 OK
Content-type: application/json
{
"@odata.context": "https://graph.microsoft.com/beta/$metadata#planner/tasks/$entity",
"@odata.etag": "W/\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBASCc=\"",
"planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
"bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
"title": "Water the plants",
"orderHint": "8586352620867692777",
"assigneePriority": "",
"percentComplete": 0,
"priority": 5,
"startDate": null,
"createdDateTime": "2019-08-20T23:46:38.708303Z",
"hasDescription": false,
"previewType": "automatic",
"completedDateTime": null,
"completedBy": null,
"referenceCount": 0,
"checklistItemCount": 0,
"activeChecklistItemCount": 0,
"conversationThreadId": null,
"id": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
"createdBy": {
"user": {
"displayName": null,
"id": "edcfc4b0-be77-4866-948a-b93267e151f8"
}
},
"appliedCategories": {},
"assignments": {},
"recurrence": {
"seriesId": "w5tLb5HceUmpuiYlhdXyHg",
"occurrenceId": 1,
"previousInSeriesTaskId": null,
"nextInSeriesTaskId": null,
"recurrenceStartDateTime": "2021-11-13T10:30:00Z",
"schedule": {
"patternStartDateTime": "2021-11-13T10:30:00Z",
"nextOccurrenceDateTime": "2021-11-15T10:30:00Z",
"pattern": {
"type": "daily",
"interval": 2,
"firstDayOfWeek": "sunday",
"dayOfMonth": 0,
"daysOfWeek": [],
"index": "first",
"month": 0
}
}
},
"dueDateTime": "2021-11-13T10:30:00Z",
"creationSource": null
}
Пометка задачи завершена, активируя повторение (1-я задача в серии)
В следующем примере запроса и ответа показано, как задать значение percentComplete100
(также называется завершение задачи или пометка задачи завершена).
Запрос
В следующем примере показан идентичный запрос для задачи с повторением или без нее.
PATCH https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV
{
"percentComplete": 100
}
Отклик
HTTP/1.1 204 NO CONTENT
Получение завершенной задачи и обнаружение идентификатора следующей (второй) задачи в серии
В следующем примере запроса и ответа показано, как получить задачу после ее завершения.
Запрос
GET https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV
Отклик
Ниже показан пример запроса. Так как назначен параметр nextInSeriesTaskId , для этой задачи больше не может быть настроено активное повторение .
HTTP/1.1 200 OK
Content-type: application/json
{
"_comment": "other fields omitted for brevity",
"percentComplete": 100,
"recurrence": {
"seriesId": "w5tLb5HceUmpuiYlhdXyHg",
"occurrenceId": 1,
"previousInSeriesTaskId": null,
"nextInSeriesTaskId": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
"recurrenceStartDateTime": "2021-11-13T10:30:00Z",
"schedule": {
"patternStartDateTime": "2021-11-13T10:30:00Z",
"nextOccurrenceDateTime": "2021-11-15T10:30:00Z",
"pattern": {
"type": "daily",
"interval": 2,
"firstDayOfWeek": "sunday",
"dayOfMonth": 0,
"daysOfWeek": [],
"index": "first",
"month": 0
}
}
},
"dueDateTime": "2021-11-13T10:30:00Z",
}
Получение новой задачи в серии (2-е вхождение)
В следующем примере запроса и ответа показано, как получить новую задачу в серии, идентификатор которой был обнаружен из nextInSeriesTaskId в предыдущем ответе.
Запрос
Пример запроса (GxOo0ms1iEu3eBI1-6lk85UAI5FI
) содержит следующие отличия по сравнению с предыдущим примером (Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV
):
- dueDateTime было присвоено значение из предыдущей задачи nextOccurrenceDateTime .
- nextOccurrenceDateTime вычисляется по расписанию: следующее вхождение после предыдущего dueDateTime.
-
occurrenceId — это
2
, а не1
-
percentComplete имеет значение
0
.
GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
Отклик
HTTP/1.1 200 OK
Content-type: application/json
{
"_comment": "other fields omitted for brevity",
"planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
"bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
"title": "Water the plants",
"percentComplete": 0,
"id": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
"appliedCategories": {},
"assignments": {},
"recurrence": {
"seriesId": "w5tLb5HceUmpuiYlhdXyHg",
"occurrenceId": 2,
"previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
"nextInSeriesTaskId": null,
"recurrenceStartDateTime": "2021-11-13T10:30:00Z",
"schedule": {
"patternStartDateTime": "2021-11-13T10:30:00Z",
"nextOccurrenceDateTime": "2021-11-17T10:30:00Z",
"pattern": {
"type": "daily",
"interval": 2,
"firstDayOfWeek": "sunday",
"dayOfMonth": 0,
"daysOfWeek": [],
"index": "first",
"month": 0
}
}
},
"dueDateTime": "2021-11-15T10:30:00Z"
}
Измените повторение задачи на один день в неделю и задайте для даты выполнения значение NULL.
В следующем примере запроса и ответа показано, как назначить null
dueDateTime и другой шаблонзадаче с активным повторением.
Запрос
PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
{
"recurrence": {
"schedule": {
"pattern": {
"type": "weekly",
"interval": 1,
"daysOfWeek": [ "tuesday" ],
"firstDayOfWeek": "sunday"
}
}
},
"dueDateTime": null
}
Отклик
HTTP/1.1 204 NO CONTENT
Снова получите задачу, чтобы увидеть результат редактирования
В следующем примере запроса и ответа показано, как получить задачу после предыдущих изменений. Вы можете ожидать, что будет отображаться указанная ранее ранее модель recurrence.schedule: еженедельно по вторникам вместе с dueDateTime = null
.
Запрос
GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
Отклик
В следующем примере задача может иметь активное повторение вместе с датой null
выполнения.
NextOccurrenceDateTime вычисляется повторно и теперь находится 23 ноября, вторник, от daysOfWeek. Это следующее вхождение вычисляется на основе исходного dueDateTime задачи от 15 ноября в понедельник.
HTTP/1.1 200 OK
Content-type: application/json
{
"_comment": "other fields omitted for brevity",
"planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
"bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
"title": "Water the plants",
"percentComplete": 0,
"id": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
"appliedCategories": {},
"assignments": {},
"recurrence": {
"seriesId": "w5tLb5HceUmpuiYlhdXyHg",
"occurrenceId": 2,
"previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
"nextInSeriesTaskId": null,
"recurrenceStartDateTime": "2021-11-13T10:30:00Z",
"schedule": {
"patternStartDateTime": "2021-11-13T10:30:00Z",
"nextOccurrenceDateTime": "2021-11-23T10:30:00Z",
"pattern": {
"type": "weekly",
"interval": 1,
"firstDayOfWeek": "sunday",
"dayOfMonth": 0,
"daysOfWeek": [ "tuesday" ],
"index": "first",
"month": 0
}
}
},
"dueDateTime": null
}
Удаление расписания повторения
В следующем примере запроса и ответа показано, как назначить null
файл recurrence.schedule, тем самым завершив повторение для этой задачи.
Запрос
PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
{
"recurrence": {
"schedule": null
}
}
Отклик
HTTP/1.1 204 NO CONTENT
Получение задачи с удаленным расписанием повторения
В следующем примере запроса и ответа показано, как получить задачу после предыдущих изменений.
Запрос
GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
Отклик
Ниже приведен пример ответа с сохраненными сведениями о ряде повторений (recurrence.schedule = null
). Если указано новое расписание, эта задача по-прежнему относится к тому же ряду.
HTTP/1.1 200 OK
Content-type: application/json
{
"_comment": "other fields omitted for brevity",
"recurrence": {
"seriesId": "w5tLb5HceUmpuiYlhdXyHg",
"occurrenceId": 2,
"previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
"nextInSeriesTaskId": null,
"schedule": null,
"recurrenceStartDateTime": "2021-11-13T10:30:00Z"
},
"dueDateTime": null
}
Случай ошибки: попытка добавить новое расписание повторения без указания шаблонаStartDateTime
В следующем примере запроса и ответа показан недопустимый запрос, попытка добавить новый recurrence.schedule без указания шаблонаStartDateTime.
Запрос
PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
{
"recurrence": {
"schedule": {
"pattern": {
"type": "daily",
"interval": 5
}
}
}
}
Отклик
Ниже приведен пример ответа, который показывает ошибку, описывающую проблему. Объект ответа содержит ошибку, так как в сообщении об ошибке должно быть указано, Recurrence.Schedule.PatternStartDateTime
а не Recurrence.Schedule.Range
. В настоящее время это известная проблема.
HTTP/1.1 400 BAD REQUEST
Content-type: application/json
{
"error": {
"code": "",
"message": "Schema validation has failed. Validation for field 'Recurrence.Schedule.Range', on entity 'Task' has failed: A non-null value must be specified for this field.",
"innerError": {
"request-id": "922f7646-513a-4f63-a231-9cf2d7b647cb",
"date": "2021-06-22T21:37:35"
}
}
}
Восстановление повторения задачи путем добавления нового расписания
В следующем примере запроса и ответа показано, как назначить новое значение recurrence.schedule задаче, которая в настоящее время содержит recurrence.schedule = null
.
Заметка:DueDateTime не назначается.
Запрос
PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
{
"recurrence": {
"schedule": {
"pattern": {
"type": "absoluteMonthly",
"interval": 2,
"dayOfMonth": 25
},
"patternStartDateTime": "2021-11-25T10:30:00Z"
}
}
}
Отклик
HTTP/1.1 204 NO CONTENT
Получение задачи с новым расписанием повторения
В следующем примере запроса и ответа показано, как получить задачу с новым расписанием повторения.
Свойства повторения (кроме расписания) остаются неизменными, и задача имеет активное повторение, даже если свойство dueDateTime остается null
.
Запрос
GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
Отклик
HTTP/1.1 200 OK
Content-type: application/json
{
"_comment": "other fields omitted for brevity",
"planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
"bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
"title": "Water the plants",
"percentComplete": 0,
"id": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
"appliedCategories": {},
"assignments": {},
"recurrence": {
"seriesId": "w5tLb5HceUmpuiYlhdXyHg",
"occurrenceId": 2,
"previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
"nextInSeriesTaskId": null,
"recurrenceStartDateTime": "2021-11-13T10:30:00Z",
"schedule": {
"patternStartDateTime": "2021-11-25T10:30:00Z",
"nextOccurrenceDateTime": "2022-01-25T10:30:00Z",
"pattern": {
"type": "absoluteMonthly",
"interval": 2,
"firstDayOfWeek": "sunday",
"dayOfMonth": 25,
"daysOfWeek": [],
"index": "first",
"month": 0
}
}
},
"dueDateTime": null
}
Случай ошибки: попытка изменить свойство только для чтения
В следующем примере запроса и ответа показан недопустимый запрос, попытка присвоить значение свойству recurrence.seriesId , которое доступно только для чтения.
Запрос
PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
{
"recurrence": {
"seriesId": "abc"
}
}
Отклик
В следующем объекте ответа отображается ошибка, описывающая проблему.
HTTP/1.1 400 BAD REQUEST
Content-type: application/json
{
"error": {
"code": "",
"message": "Invalid recurrence sub-property assignment(s): \"seriesId\".",
"innerError": {
"request-id": "922f7646-513a-4f63-a231-9cf2d7b647cb",
"date": "2021-06-22T21:37:35"
}
}
}
Пометьте задачу завершенной, вызвав повторение (2-я задача в серии, с значением NULL dueDateTime)
В следующем примере запроса и ответа показано, как задать значение percentComplete100
(также называется завершение задачи или пометка задачи завершена).
Запрос
Следующий запрос идентичен для задачи с повторением или без нее.
PATCH https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
{
"percentComplete": 100
}
Отклик
HTTP/1.1 204 NO CONTENT
Получение завершенной задачи и обнаружение идентификатора следующей (третьей) задачи в серии
В следующем примере запроса и ответа показано, как получить задачу после ее завершения.
Запрос
GET https://graph.microsoft.com/beta/planner/tasks/GxOo0ms1iEu3eBI1-6lk85UAI5FI
Отклик
HTTP/1.1 200 OK
Content-type: application/json
{
"_comment": "other fields omitted for brevity",
"planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
"bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
"title": "Water the plants",
"percentComplete": 100,
"id": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
"appliedCategories": {},
"assignments": {},
"recurrence": {
"seriesId": "w5tLb5HceUmpuiYlhdXyHg",
"occurrenceId": 2,
"previousInSeriesTaskId": "Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV",
"nextInSeriesTaskId": "-6zr7XfE6E2JvxCSmE7Wdf8AClON",
"recurrenceStartDateTime": "2021-11-13T10:30:00Z",
"schedule": {
"patternStartDateTime": "2021-11-25T10:30:00Z",
"nextOccurrenceDateTime": "2022-01-25T10:30:00Z",
"pattern": {
"type": "absoluteMonthly",
"interval": 2,
"firstDayOfWeek": "sunday",
"dayOfMonth": 25,
"daysOfWeek": [],
"index": "first",
"month": 0
}
}
},
"dueDateTime": null
}
Ошибка: попытка удалить расписание повторения, если nextInSeriesTaskId уже назначен
В следующем примере запроса и ответа показан недопустимый запрос, попытка присвоить значение свойству recurrence.schedule после назначения свойства nextInSeriesTaskId .
Запрос
PATCH https://graph.microsoft.com/beta/planner/tasks/Q7SNdWp5ekeJTpRRSCcZ3pUAD6kV
{
"recurrence": {
"schedule": null
}
}
Отклик
В следующем объекте ответа отображается ошибка, описывающая проблему.
HTTP/1.1 400 BAD REQUEST
Content-type: application/json
{
"error": {
"code": "",
"message": "Schema validation has failed. Validation for field 'Recurrence', on entity 'Task' has failed: Cannot add/edit/delete recurrence when the next instance should already be created.",
"innerError": {
"request-id": "922f7646-513a-4f63-a231-9cf2d7b647cb",
"date": "2021-06-22T21:37:35"
}
}
}
Получение новой задачи в серии (3-е вхождение)
В следующем примере запроса и ответа показано, как получить новую задачу в серии, идентификатор которой вы обнаружили из nextInSeriesTaskId в предыдущем ответе.
DueDateTime было присвоено значению, представленному в предыдущем nextOccurrenceDateTime задачи, даже если предыдущее dueDateTime задачи было null
.
Запрос
GET https://graph.microsoft.com/beta/planner/tasks/-6zr7XfE6E2JvxCSmE7Wdf8AClON
Отклик
HTTP/1.1 200 OK
Content-type: application/json
{
"_comment": "other fields omitted for brevity",
"planId": "4CaQUsrKXkyMDBhpF9cu-JUAAZ1V",
"bucketId": "mVAeurfATUOEkpxi-60a9pUAJDxm",
"title": "Water the plants",
"percentComplete": 0,
"id": "-6zr7XfE6E2JvxCSmE7Wdf8AClON",
"appliedCategories": {},
"assignments": {},
"recurrence": {
"seriesId": "w5tLb5HceUmpuiYlhdXyHg",
"occurrenceId": 3,
"previousInSeriesTaskId": "GxOo0ms1iEu3eBI1-6lk85UAI5FI",
"nextInSeriesTaskId": null,
"recurrenceStartDateTime": "2021-11-13T10:30:00Z",
"schedule": {
"patternStartDateTime": "2021-11-25T10:30:00Z",
"nextOccurrenceDateTime": "2022-03-25T10:30:00Z",
"pattern": {
"type": "absoluteMonthly",
"interval": 2,
"firstDayOfWeek": "sunday",
"dayOfMonth": 25,
"daysOfWeek": [],
"index": "first",
"month": 0
}
}
},
"dueDateTime": "2022-01-25T10:30:00Z"
}