Отправка типовой задачи специального вида из плагина Chronos
Отправка типовой задачи специального вида из плагина Chronos¶
Пусть существует плагин Chronos, который должен по некоторым условиям отправить пользователю или группе пользователей задание с функциями типовых задач (отправка, подзадачи, визуализация). Такой плагин может быть серверным и работать от имени пользователя System.
// мы в серверном плагине Chronos, работаем от имени пользователя System
var unityContainer = await new UnityContainer().RegisterServerForPluginAsync();
var cardRepository = unityContainer.Resolve<ICardRepository>();
// загружаем карточку
Guid cardID = ...;
var getResponse = await cardRepository.GetAsync(new CardGetRequest { CardID = cardID }, cancellationToken);
if (!getResponse.ValidationResult.IsSuccessful())
{
// ошибка, надо залогировать и выйти
return;
}
var card = getResponse.Card;
// создаём бизнес-процесс и задачу "Постановка задачи" с указанным ID = mainTaskRowID
Guid mainTaskRowID = Guid.NewGuid();
var storeInfo = new Dictionary<string, object>(StringComparer.Ordinal);
storeInfo.SetStartingProcessName(WfHelper.ResolutionProcessName);
storeInfo.SetStartingProcessTaskRowID(mainTaskRowID);
card.RemoveAllButChanged();
var storeRequest = await cardRepository.StoreAsync(new CardStoreRequest { Card = card, Info = storeInfo }, cancellationToken);
if (!storeRequest.ValidationResult.IsSuccessful())
{
// ошибка, надо залогировать и выйти
return;
}
// завершаем "Постановку задачи" с вариантом "Отправить"
getResponse = await cardRepository.GetAsync(new CardGetRequest { CardID = cardID }, cancellationToken);
if (!getResponse.ValidationResult.IsSuccessful())
{
// ошибка, надо залогировать и выйти
return;
}
card = getResponse.Card;
var task = card.Tasks.FirstOrDefault(x => x.RowID == mainTaskRowID);
if (task == null)
{
// ошибка, надо залогировать и выйти
return;
}
// кому отправляем, любая роль, в т.ч. конкретный сотрудник
Guid roleID = ...;
string roleName = ...;
var performerRows = task.Card.Sections[WfHelper.ResolutionPerformersSection].Rows;
var performer = performerRows.Add();
performer.RowID = Guid.NewGuid();
performer[WfHelper.ResolutionPerformerOrderField] = Int32Boxes.Zero;
performer[WfHelper.ResolutionPerformerRoleIDField] = roleID;
performer[WfHelper.ResolutionPerformerRoleNameField] = roleName;
performer.State = CardRowState.Inserted;
// комментарий
string comment = ...;
var resolutionFields = task.Card.Sections[WfHelper.ResolutionSection].Fields;
resolutionFields[WfHelper.ResolutionCommentField] = comment;
// планируемая дата завершения
double durationInDays = ...;
resolutionFields[WfHelper.ResolutionDurationInDaysField] = durationInDays;
resolutionFields[WfHelper.ResolutionPlannedField] = null;
// вид задачи
resolutionFields[WfHelper.ResolutionKindIDField] = new Guid("..."); // из справочника видов задач
resolutionFields[WfHelper.ResolutionKindCaptionField] = "Тестовое задание";
// вариант завершения - отправить
task.OptionID = DefaultCompletionOptions.SendToPerformer;
task.Action = CardTaskAction.Complete;
task.State = CardRowState.Deleted;
card.RemoveAllButChanged();
storeRequest = await cardRepository.StoreAsync(new CardStoreRequest { Card = card }, cancellationToken);
if (!storeRequest.ValidationResult.IsSuccessful())
{
// ошибка, надо залогировать и выйти
return;
}