Изменение состояния карточки, которое было добавлено в таблицу-перечисление KrDocState
Изменение состояния карточки, которое было добавлено в таблицу-перечисление KrDocState¶
Состояния карточки, которые использует типовое решение, содержатся в таблице KrDocState
. Чтобы добавить новые состояния карточки (например, “В архиве”, “На доработке” и пр.), нужно добавить записи в эту таблицу с опциональной локализацией. Для этого в редакторе схемы данных надо выбрать таблицу, перейти на узел “Записи” и вставить строки с состояниями. Тогда все представления и правила доступа типового решения получат возможность использовать это состояние для фильтрации и разделения прав.
Для того, чтобы перевести карточку в новое состояние в расширениях (например, в бизнес-процессах Workflow API), требуется написать и вызвать метод SetKrState
, передав в его параметрах:
-
cardRepository
- объект ICardRepository с расширениями (CardRepositoryNames.Extended или ExtendedWithoutTransaction). Обеспечивает загрузку и сохранение карточки-сателлита KrSatellite, в которой физически хранятся поля с состоянием документа. -
cardID
- идентификатор карточки документа, для которой меняется состояние. -
stateID
- идентификатор состояния в том же виде, в каком он задан в таблице KrDocState. -
stateName
- отображаемое пользователю имя состояния в том же виде, в каком оно задано в таблице KrDocState. Обычно это константа локализации.
public static void SetKrState(ICardRepository cardRepository, Guid cardID, int stateID, string stateName)
{
// Если код происходит внутри транзкации на сохранение карточки (CardStoreExtension AfterBeginTransaction/BeforeCommitTransaction)
// IKrScope krScope = this.unityContainer.Resolve<IKrScope>();
Card satellite = this.krScope.GetKrSatellite(cardID, validationResult);
// Иначе
// карточка-сателлит будет автоматически создана, если она отсутствовала при загрузке
Card satellite = GetSatelliteCard(cardRepository, cardID);
var fields = satellite.Sections["KrApprovalCommonInfo"].Fields;
fields["StateID"] = stateID;
fields["StateName"] = stateName;
satellite.RemoveAllButChanged();
var storeRequest = new CardStoreRequest { Card = satellite };
cardRepository.Store(storeRequest);
}
public static Card GetSatelliteCard(ICardRepository cardRepository, Guid mainCardID)
{
CardGetRequest getRequest = new CardGetRequest
{
CardID = mainCardID,
CardTypeID = DefaultCardTypes.KrSatelliteTypeID,
RestrictionFlags = CardGetRestrictionValues.Satellite,
};
// если мы внутри Workflow API, то необходимо добавить строку, чтобы блокировка на основную карточку не бралась:
getRequest.SetNoLockingMainCard(true);
CardGetResponse response = cardRepository.Get(getRequest);
return response.Card;
}
Important
В сборке 2.2 и более ранних при использовании метода GetSatelliteCard внутри Workflow API карточка-сателлит уже должна быть создана. В противном случае будет отброшена транзакция Workflow, и будет создана транзакция на создание сателлита. Это можно сделать, вызвав метод GetSatelliteCard в запросе BeforeRequest перед запуском бизнес-процесса.
Чтобы состояние карточки отображалось в блоке KrBlockForDocStatus
даже в том случае, когда не используется типовой процесс согласования и регистрации, следует изменить расширение KrHideApprovalTabOrDocStateBlockUIExtension
в типовом решении в проекте Tessa.Extensions.Default.Client
, убрав вызов метода CollapseSpecialBlock
.
// удаляем вкладку согласования
if (usedComponents.HasNot(KrComponents.Approving))
{
view.Tabs.Remove("ApprovalProcess");
// удаляем строки ниже:
//if (usedComponents.HasNot(KrComponents.Registration))
//{
// CollapseSpecialBlock(view);
//}
}