Завершение задания
Завершение задания¶
Если требуется программно завершить задание, необходимо написать следующий метод:
/// <summary>
/// Завершает задание.
/// </summary>
/// <param name="cardID">ID карточки</param>
/// <param name="taskID">ID задание, которое требуется завершить</param>
/// <param name="taskTypeID">ID типа задания</param>
/// <param name="sessionUserID">ID пользователя из текущей сессии</param>
/// <param name="sessionUserName">Иья пользователя из текущей сессии</param>
/// <param name="comment">Коментарий при завершении задания</param>
/// <param name="db">объект DbManager</param>
/// <param name="cardMetadata">Метаинформация, необходимая для использования типов карточек совместно с пакетом карточек</param>
/// <param name="cardRepository">Репозиторий для управления карточками</param>
private void CompleteTask(
Guid cardID,
Guid taskID,
Guid taskTypeID,
Guid sessionUserID,
string sessionUserName,
string comment,
DbManager db,
ICardMetadata cardMetadata,
ICardRepository cardRepository)
{
db.BeginTransaction();
var validationResult = new ValidationResultBuilder();
this.container.Resolve<ICardTransactionStrategy>()
.ExecuteInWriterLock((Guid)cardID, CardComponentHelper.DoNotCheckVersion, validationResult,
p =>
{
// создаём запрос на получение информации по карточке от сервиса карточек.
var getRequest = new CardGetRequest
{
CardID = cardID,
GetMode = CardGetMode.ReadOnly,
RestrictionFlags = CardGetRestrictionFlags.RestrictFiles |
CardGetRestrictionFlags.RestrictTasks |
CardGetRestrictionFlags.RestrictTaskHistory
};
// загружаем карточку
var getResponse = cardRepository.Get(getRequest);
if (!validationResult.IsSuccessful())
{
logger.Error(validationResult);
p.ReportError = true;
return;
}
var card = getResponse.Card;
// очищаем список всех заданий карточки
card.Tasks.Clear();
// запрашиваем задание
var taskContextList =
cardGetStrategy.TryLoadTaskInstances(
(Guid)cardID,
card,
db,
cardMetadata,
validationResult,
sessionUserID,
loadCalendarInfo: false,
taskRowIDList: new Guid[] { taskID }
);
if (taskContextList.Count == 0)
{
p.ReportError = true;
return;
}
var taskToComplete = card.Tasks[0];
// если пользователь входит в роль задания
// завершаем задание
if (taskToComplete.IsPerformer)
{
// Получаем секции задания
var taskContext = taskContextList[0];
cardGetStrategy.LoadSections(taskContext);
string cardDigest;
CardStoreRequest request;
CardStoreResponse response;
// завершаем задание
taskToComplete.Action = CardTaskAction.Complete;
taskToComplete.State = CardRowState.Deleted;
// устанавливаем комментарий при завершении задания согласования
// или при завершении задачи
if (taskTypeID == DefaultTaskTypes.KrApproveTypeID)
{
taskToComplete.Card.Sections["KrTask"].Fields["Comment"] = comment;
}
else if (taskTypeID == DefaultTaskTypes.WfResolutionTypeID)
{
taskToComplete.Card.Sections[WfHelper.ResolutionSection]
.Fields[WfHelper.ResolutionCommentField] = comment;
}
taskToComplete.Flags = taskToComplete.Flags | CardTaskFlags.HistoryItemCreated;
// устанавливаем пользователя, если задание не взято в работу
// для того чтобы были заполнены поля карточки "Согласовали" и "Не согласовали"
// на вкладке "Процесс согласования"
if (taskToComplete.StoredState == CardTaskState.Created)
{
taskToComplete.UserID = sessionUserID;
taskToComplete.UserName = sessionUserName;
}
// cоздаёт подписанный токен безопасности для заданной информации по карточке
// с указанием прав для процесса согласования
var token = tokenProvider.CreateToken(card.ID, card.Version);
token.Set(card.Info);
// получаем Digest для заданной карточки,
// или null, если Digest неизвестен или не требуется.
cardDigest = cardRepository.GetDigest(card);
// удаляем информацию обо всех полях или строках всех секций карточки,
// которые не были изменены
card.RemoveAllButChanged();
request = new CardStoreRequest { Card = card };
// устанавливаем Digest для сохранения в историю действий с карточкой
request.SetDigest(cardDigest);
// сохраняем карточку
response = cardRepository.Store(request);
if (!response.ValidationResult.IsSuccessful())
{
logger.Error(response.ValidationResult);
p.ReportError = true;
return;
}
db.CommitTransaction();
}
else
{
logger.Trace("Task cannot be completed. User is not performer.");
p.ReportError = true;
}
});
}