Russian (Русский) - Change language

Пример пользовательского этапа обработки

Пример показывает, как с помощью пользовательского этапа создать дополнительную стадию ручной проверки данных. Например, её можно использовать для проведения проверок отделом безопасности. Для пакетов, находящихся на пользовательском этапе, сотрудники отдела подтверждают отправку документов, которые удовлетворяют определенным условиям, на дальнейшую обработку и отклоняют остальные.

Ко всем подтвержденным документам прикрепляется набор байт, имитирующий цифровую подпись.

Проект и материалы для скачивания: UserStage.zip

Алгоритм примера

  • Настройка соединения
  • Начало работы с проектом
  • Получение и обработка списка задач
  • Обработка каждой задачи на сервисной стадии
  • Загрузка файла на сервер
  • Завершение работы примера

Запуск примера

Запустите UserStageExample.sln в Visual Studio 2013 или более поздней версии.

1. Введите URL сервера приложений

2. Выберите тип аутентификации

3. Нажмите на кнопку Login

Настройка соединения

private const string FlexiHandlerPath = "/FlexiCapture12/Server/{0}API/v1/Soap"; // Путь к API FlexiCapture
private const string FlexiCaptureAuthPart = "FCAuth/"; // Путь к аутентификации FlexiCapture
    
private const string UserStageProjectName = "UserStageExample"; // Название проекта, с которым работает пример
private const string UserStageName = "Service"; // Название сервисной стадии
    
// Создаётся новая привязка
var binding = new BasicHttpBinding();

// Размер сообщения по-умолчанию слишком мал для FlexiCapture - увеличиваем
binding.MaxReceivedMessageSize = MessageSize;
    
// Выбираем метод защиты соединения, в зависимости от протокола
binding.Security.Mode = serverUri.Scheme == Uri.UriSchemeHttps
   ? BasicHttpSecurityMode.Transport
   : BasicHttpSecurityMode.TransportCredentialOnly;

// Выбор метода аутентификации
binding.Security.Transport.ClientCredentialType = windowsAuth
   ? HttpClientCredentialType.Windows
   : HttpClientCredentialType.Basic;

// Выбор пути к API, в зависимости от метода аутентификации
var externalSuffix = windowsAuth ? string.Empty : FlexiCaptureAuthPart;
var remoteAddress = new EndpointAddress(new Uri(serverUri, string.Format(FlexiHandlerPath, externalSuffix)));

// Создание SOAP клиента
_client = new FlexiCapture.FlexiCaptureWebServiceSoapClient(binding, remoteAddress);
// Для аутентификации FlexiCapture нужно указать логин и пароль
if (_client.ClientCredentials != null && !windowsAuth)
{
   _client.ClientCredentials.UserName.UserName = login;
   _client.ClientCredentials.UserName.Password = password;
}
Начало работы с проектом
// Открыть сессию
_sessionId = _client.OpenSession(RoleType, WorkstationType);
var projectGuid = string.Empty;
    
// Найти нужный проект
foreach (var project in _client.GetProjects())
{
   if (project.Name == UserStageProjectName)
   {
      projectGuid = project.Guid;
   }
}
if (string.IsNullOrEmpty(projectGuid))
{
   MessageBox.Show("На сервере нет проекта UserStageExample, необходимого для работы примера");
}
    
// Открыть проект
_projectId = _client.OpenProject(_sessionId, projectGuid);
    
// Найти и запомнить идентификатор сервисной стадии
var stages = _client.GetProcessingStages(_projectId, 0, 0, UserStageName);
if (stages.Count != 1) throw new Exception("Invalid project");
   _serviceStageId = stages[0].Id;
    
// Найти и запомнить external id стадии исключений
stages = _client.GetProcessingStages(_projectId, 0, ExceptionStageType, string.Empty);
if (stages.Count != 1) throw new Exception("Invalid project");
   _exceptionsStageId = stages[0].ExternalId;
    

Получение и обработка списка задач, ожидающих на сервисной стадии

// Получить список задач
var tasks = _client.GetAvailableTasksByStageId(_sessionId, _projectId,
new FlexiCapture.stageIds() { _serviceStageId }, false);
var result = new Dictionary<int, Task>();
if (tasks == null || tasks.Count == 0) return result;
foreach (var task in tasks)
{
   // Для каждой задачи создаётся объект типа Task
   var item = new Task
   {
      Id = task.Id,
      BatchId = task.BatchId
   };
    
   // Получение списка документов, входящих в задачу
   var documents = _client.GetTaskDocuments(task.Id);
   if (documents == null || documents.Count == 0) continue;
   foreach (var document in documents)
   {
      // Загрузка сопровождающего задачу XML
      var file = _client.LoadDocumentResult(_sessionId, document.BatchId, document.Id, "DocumentBody"); // "DocumentBody" - имя файла, содержащего распознанные данные
      if (file == null || file.Bytes == null) continue;
      // Разбор XML
      var doc = new Document(document.Id, XDocument.Load(new MemoryStream(file.Bytes)));
      // Сохранение разобранного списка документов
      item.Documents.Add(document.Id, doc);
   }
   result.Add(item.Id, item);
}
    

Отправка задачи на дальнейшую обработку

var ids = new FlexiCapture.docIds();
foreach (var rejectedDocument in rejectedDocuments)
{
   ids.Add(rejectedDocument.Id);
}
if (ids.Count > 0)
{
   _client.CreateTask(_sessionId, batchId, _exceptionsStageId, 0, "Rejection reason", 0, ids, false);
}
_client.OpenBatch(_sessionId, batchId);
var hasDocuments = false;
try
{
   var uri = _client.Endpoint.Address.Uri.OriginalString.Replace("/API/v1/Soap", "/FileService/v1");
   foreach (var document in acceptedDocuments)
   {
      hasDocuments = true;
      var buffer = new byte[SignatureSize]; // Размер электронной подписи, добавляемой к документам: 1024
      _rng.GetBytes(buffer);
      //DocumentAttachment: Тип вложения (9 - вложение к документу)
      _client.SaveAttachment(_sessionId, DocumentAttachment, document.Id, batchId, _projectId, new FlexiCapture.File
      {
         Bytes = buffer,
         Name = "Signature.dat"
      });
      document.CreateStamp();
      UploadTextFileToServer(new Uri(uri),
         _client.ClientCredentials.UserName.UserName,
         _client.ClientCredentials.UserName.Password,
         document.GetXml(), 0, _sessionId, _projectId,
         batchId, 0, document.Id, 0, "DocumentBody"
      ).Wait();
   }
};
    

Загрузка файла на сервер

Завершение работы

_client.CloseProject(_sessionId, _projectId);
_client.CloseSession(_sessionId);

10.11.2020 12:08:08


Please leave your feedback about this article