Отправка типовой задачи специального вида из плагина Chronos
Отправка типовой задачи специального вида из плагина Chronos¶
Пусть существует плагин Chronos, который должен по некоторым условиям отправить пользователю или группе пользователей задание с функциями типовых задач (отправка, подзадачи, визуализация). Такой плагин может быть серверным и работать от имени пользователя System.
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
// ниже содержимое метода EntryPointAsync у плагина
await using var companion = new UnityContainerCompanion { UseConfiguration = true };
await companion.ProcessAsync(
static (c, ct) => c.Container.RegisterServerForPluginAsync(cancellationToken: ct),
static async (c, ct) =>
{
// поскольку мы в серверном плагине Chronos, работаем от имени пользователя System
var cardRepository = unityContainer.Resolve<ICardRepository>();
// загружаем карточку
Guid cardID = ...;
var getResponse = await cardRepository.GetAsync(new() { CardID = cardID }, ct);
if (!getResponse.ValidationResult.IsSuccessful())
{
// ошибка, надо залогировать и выйти
logger.LogResult(getResponse.ValidationResult);
return;
}
var card = getResponse.Card;
// создаём бизнес-процесс и задачу "Постановка задачи" с указанным ID = mainTaskRowID
Guid mainTaskRowID = Guid.NewGuid();
var storeInfo = new Dictionary<string, object?>();
storeInfo.SetStartingProcessName(WfHelper.ResolutionProcessName);
storeInfo.SetStartingProcessTaskRowID(mainTaskRowID);
card.RemoveAllButChanged();
var storeResponse = await cardRepository.StoreAsync(new() { Card = card, Info = storeInfo }, ct);
if (!storeResponse.ValidationResult.IsSuccessful())
{
// ошибка, надо залогировать и выйти
logger.LogResult(storeResponse.ValidationResult);
return;
}
// завершаем "Постановку задачи" с вариантом "Отправить"
getResponse = await cardRepository.GetAsync(new() { CardID = cardID }, ct);
if (!getResponse.ValidationResult.IsSuccessful())
{
// ошибка, надо залогировать и выйти
logger.LogResult(getResponse.ValidationResult);
return;
}
card = getResponse.Card;
var task = card.TryGetTasks()?.FirstOrDefault(x => x.RowID == mainTaskRowID);
if (task is null)
{
// ошибка, надо залогировать и выйти
logger.Error("Can't find main task with ID={0:B}", mainTaskRowID);
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();
storeResponse = await cardRepository.StoreAsync(new() { Card = card }, ct);
if (!storeResponse.ValidationResult.IsSuccessful())
{
// ошибка, надо залогировать и выйти
logger.LogResult(storeResponse.ValidationResult);
return;
}
},
cancellationToken);