Потоковый ввод документов¶
Модуль потокового ввода документов предназначен для обработки результата потокового сканирования (или любого другого источника электронных документов).
Настройка модуля потокового ввода документов описана в Руководстве администратора
Система оперирует обработчиками потокового ввода. По умолчанию доступны следующие обработчики:
- Потоковый ввод по ШК. Распознавание отсканированного штрих-кода и прикрепление скана документа к карточке.
Поддерживаемые форматы документов:png,jpg,jpeg,pdf,tif,tiff. - Потоковый ввод входящих писем с использованием ИИ. Распознавание данных отсканированного входящего документа с использованием ИИ. С последующим созданием/обновлением входящих документов.Поддерживаемые форматы документов:
png,jpg,jpegpdf,tif,tiff,doc,docx,xls,xlsx.
Собственные обработчики потокового ввода¶
Система позволяет зарегистрировать и использовать собственные обработчики потокового ввода. Для этого необходимо реализовать наследник IDocLoadFilesBehavior:
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Tessa.Imaging.DocLoad;
using Tessa.Platform.Plugins;
namespace Tessa.Extensions.Default.Imaging.Ai
{
public sealed class MyDocLoadBehavior : IDocLoadFilesBehavior
{
#region IDocLoadFilesBehavior Members
/// <summary>
/// Обработка набора файлов в потоковом вводе.
/// </summary>
/// <param name="context">Контекст выполнения плагина Кронос.</param>
/// <param name="settings">Настройки потокового ввода.</param>
/// <param name="subfolderSettingsInfo">
/// Объект с настройками характерными для обрабатываемой подпапки.
/// </param>
/// <param name="inputFilePaths">Входящий набор путей к файлам.</param>
/// <param name="outputFolder">
/// Имя конечной папки, сформированное по формату,
/// указанному в настройке: <c>DocLoad.OutputFolderFormat</c>.
/// </param>
/// <param name="cancellationToken">
/// Объект, посредством которого можно отменить асинхронную задачу.
/// </param>
/// <returns>Асинхронная задача.</returns>
public async Task ProcessFilesAsync(
IPluginExecutingContext context,
IDocLoadSettings settings,
Dictionary<string, object?>? subfolderSettingsInfo,
IList<string> inputFilePaths,
string outputFolder,
CancellationToken cancellationToken = default)
{
// Тут должна быть описана обработка файлов из inputFilePaths
...
// Так же тут можно получать настройки специфичные для данного обработчика
var mySettingBoolean = StorageHelper.tryGet<boolean>(json, 'MySettingBoolean');
}
/// <summary>
/// Настройки по умолчанию для сценария обработки.
/// </summary>
public Dictionary<string, object?> DefaultSettings =>
// Тут подразумевается Storage объект
// с дополнительными настройками необходимыми для обработчика.
// Если настроек нет - необходимо просто вернуть пустой Dictionary.
new()
{
{ "MySettingBoolean", false }
};
/// <summary>
/// Имя.
/// </summary>
public string Name => "$DocLoad_MyDocLoadBehavior";
/// <summary>
/// Описание.
/// </summary>
public string Description => "$DocLoad_MyDocLoadBehavior_Description";
#endregion
}
}
Обработка в рамках метода ProcessFilesAsync может быть любая, например с использованием OCR или ИИ.
Полученный класс необходимо зарегистрировать его в IDocLoadBehaviorResolver:
using Tessa.Imaging.DocLoad;
using Tessa.Platform;
namespace Tessa.Extensions.Default.Imaging.Ai
{
[Registrator]
public class Registrator : RegistratorBase
{
public override void RegisterUnity()
{
this.UnityContainer
// Register DocLoad Behaviors
.TryResolve<IDocLoadBehaviorResolver>()?
.Register<MyDocLoadBehavior>(nameof(MyDocLoadBehavior))
;
}
}
}
Дополнительные настройки обработчиков потокового ввода¶
Обработчики потокового ввода могут иметь дополнительные настройки. Настройки по умолчанию задаются в IDocLoadFilesBehavior.DefaultSettings, а для их указания в интерфейсе необходимо реализовать наследник DocLoadFilesBehaviorUIConfigurator длл WEB-клиента:
import { injectable, localize } from '@tessa/application';
import { IStorage } from '@tessa/core';
import { DocLoadFilesBehaviorUIConfigurator } from 'tessa/ui/imaging/docLoadFilesBehaviorUIConfigurator';
import { PropertyGridBuilder } from 'tessa/ui/propertyGrid';
@injectable()
export class MyDocLoadBehaviorUIConfigurator extends DocLoadFilesBehaviorUIConfigurator {
//#region constructors
constructor() {
super(
// Тут указывается имя обработчика для которого реализуется UIConfigurator
'MyDocLoadBehavior',
// Вторым параметром передаётся делегат, который возвращает массив
// PropertyGrid контрол для редактирования настроек.
dataProvider => {
const mySettingBooleanProperty = PropertyGridBuilder.createBooleanProperty({
data: dataProvider,
alias: 'MySettingBoolean',
visibility: true,
captionVisibility: true,
caption: '$CardTypes_Controls_DocLoad_MySettingBoolean'
});
return [mySettingBooleanProperty];
},
// Третьим параметром передаётся делегат, преобразующий настройки в читаемый формат
// для их красивого отображения в строке таблицы.
jsonSettingsString => {
const json = JSON.parse(jsonSettingsString) as IStorage;
const mySettingBoolean = json['MySettingBoolean'] as boolean;
return (
localize('$CardTypes_Controls_DocLoad_MySettingBoolean') +
': ' +
(mySettingBoolean ? localize('$UI_Common_Yes') : localize('$UI_Common_No'))
);
}
);
}
//#endregion
}
Данный класс необходимо зарегистрировать в DI контейнере:
import { ExtensionRegistrator } from '@tessa/application';
import {
IDocLoadFilesBehaviorUIConfigurator$,
IDocLoadFilesBehaviorUIConfiguratorResolver$
} from 'tessa/ui/imaging';
import { MyDocLoadBehaviorUIConfigurator } from './myDocLoadBehaviorUIConfigurator';
export const ImagingRegistrator: ExtensionRegistrator = {
async registerTypes(container) {
// Регистрация Resolver-а конфигураторов.
container
.bind(IDocLoadFilesBehaviorUIConfiguratorResolver$)
.toFactory(({ container }) => (id: string) => {
if (container.isBoundNamed(IDocLoadFilesBehaviorUIConfigurator$, id)) {
return container.getNamed(IDocLoadFilesBehaviorUIConfigurator$, id);
} else {
return undefined;
}
});
// Регистрация конфигураторов.
container
.bind(IDocLoadFilesBehaviorUIConfigurator$)
.to(MyDocLoadBehaviorUIConfigurator)
.inRequestScope()
.whenTargetNamed('MyDocLoadBehavior');
}
};
ImagingRegistrator.registerTypes() должен быть учтён при регистрации бандла в Application.instance.registerBundle()