Перейти к содержанию

Изменение состояния карточки, которое было добавлено в таблицу-перечисление 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); //} }

Back to top