Создаём карточку с приложенным файлом из плагина Chronos
Создаём карточку с приложенным файлом из плагина Chronos¶
Требуется создать карточку и приложить к ней файл с заданным контентом. Мы будем использовать для этого серверный API TESSA.
using System.Text;
using Chronos.Plugins;
using NLog;
using Tessa.Cards;
using Tessa.Extensions.Default.Shared;
using Tessa.Files;
using Tessa.Platform;
using Tessa.Platform.Validation;
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) =>
{
var cardRepository = c.Container.Resolve<ICardRepository>();
var manager = c.Container.Resolve<ICardFileManager>();
var typesCache = c.Container.Resolve<IKrTypesCache>();
// создаём карточку контрагента
var typeID = DefaultCardTypes.PartnerTypeID;
var newRequest = new CardNewRequest();
// проверяем используется ли тип документа в типовом решении
if (typesCache.DocTypes.FirstOrDefault(x => x.ID == typeID) is { } docType)
{
newRequest.CardTypeID = docType.CardTypeID;
newRequest.Info[KrConstants.Keys.DocTypeID] = typeID;
newRequest.Info[KrConstants.Keys.DocTypeTitle] = docType.Caption;
}
else
{
newRequest.CardTypeID = typeID;
}
// для создания карточки из типового решения должны быть права создания для заданного типа у скрытого пользователя System
var newResponse = await cardRepository.NewAsync(newRequest, ct);
// логируем сообщения при создании, если они есть
logger.LogResult(newResponse.ValidationResult);
// если не удалось создать карточку - выходим
if (!newResponse.ValidationResult.IsSuccessful())
{
return;
}
// теперь у нас есть карточка card, в ней можно заполнить нужные поля и добавить файл
var card = newResponse.Card;
card.ID = Guid.NewGuid();
await using (var fileContainer = await manager.CreateContainerAsync(card, cancellationToken: ct))
{
var contentText = "...";
var contentBytes = Encoding.UTF8.GetBytes(contentText);
await fileContainer
.FileContainer
.BuildFile("fileName.txt")
// можно использовать SetContentText, однако предположим, что здесь абстрактный массив байт
.SetContent(contentBytes)
.AddWithNotificationAsync(cancellationToken: ct);
var storeResponse = await fileContainer.StoreAsync(cancellationToken: ct);
if (!storeResponse.ValidationResult.IsSuccessful())
{
// пишем ошибку или другие сообщения в лог
logger.LogResult(storeResponse.ValidationResult);
}
}
},
cancellationToken);