API для построения отчетов

Классы

Класс ReportContext

Служит для получения данных для построения отчётов.

Члены класса Описание
public RPerson CurrentPerson { get; } Получение пользователя, подключенного к системе.
public IList<RObject> Objects { get; set; } Коллекция объектов для построения отчёта. Это свойство должно быть проинициализировано, если отчёт строится по объектам.
public RType GetType(int id); Получение типа по идентификатору.
public RType GetType(string name); Получение типа по имени.
public IList<RType> GetTypes(); Получение всех типов, зарегистрированных в базе.
public ROrganisationUnit GetOrganisationUnit(int id); Получение организационной единицы по идентификатору.
public IList<ROrganisationUnit> GetOrganisationUnits(); Получение всех организационных единиц, зарегистрированных в системе.
public RPerson GetPersonOnPosition(int id); Получение пользователя, состоящего на должности с указанным идентификатором.
RPerson GetPerson(int id); Получение пользователя по идентификатору.
public IList<RPerson> GetPeople(); Получение всех зарегистрированных в системе пользователей.
public RObject GetObject(Guid id); Получение объекта по идентификатору.
Параметры:
builder - конструктор поисковых запросов,
contextId - идентификатор объекта, в контексте которого будет производиться поиск. При значении null поиск производится по всей базе.
Подробнее см. Поисковые запросы.
public IList<RObject> GetObjects(IEnumerable<Guid> ids); Пакетное получение объектов по идентификаторам.
public IList<RObject> GetObjects(IQueryBuilder builder, Guid? contextId = null); Получение объектов, соответствующих поисковому запросу.
Параметры:
builder - конструктор поисковых запросов.
Подробнее см. в Поисковые запросы.
public IList<INUserState> GetUserStates(); Возвращает список пользовательских состояний, зарегистрированных в базе данных.
public Stream OpenFile(INFile file); Открытие файла на чтение. При отсутствии файла в локальном кеше содержимое файла будет скачано с сервера.
public IList<RChatMessage> LoadMessages((Guid chatId, DateTime dateFromUtc, DateTime dateToUtc, int maxNumber); Получение сообщений по чату.
Параметры:
chatId - идентификатор чата,
dateFromUtc - минимальное время создания сообщения,
dateToUtc - максимальное время создания сообщения,
maxNumber - максимальное количество возвращаемых сообщений.

Перед вызовом этого метода для нового чата неоходимо вызвать метод LoadChat для текущего чата.

public RChatInfo LoadChat(Guid chat); Получение чата с указанным идентификатором.
string GetPilotUrl(Guid targetObjectId, DateTime? versionUtc = null); Конструктор строки для формирования ссылки на объекты Pilot

Пример инициализации для получения объектов типа с именем document:

C#:

ReportContext context = new ReportContext();

private void PilotReport_DataSourceDemanded(object sender, System.EventArgs e)

{

LongRunning.Start(this, () => {

var documentType = context.GetType("document");

var objectsBuilder = QueryBuilder.CreateObjectQueryBuilder();

objectsBuilder.Must(ObjectFields.TypeId.Be(documentType.Id));

var objects = context.GetObjects(objectsBuilder);

DataSource = context;

});

}

Класс RObject

Представляет собой объект.

Члены класса Описание
public Guid Id { get; } Идентификатор объекта.
public RType Type { get; } Тип объекта.
public RObject Parent { get; } Родительский объект.
public RPerson Creator { get; } Создатель объекта.
public DateTime CreatedUtc { get; } Дата создания объекта в формате UTC.
public string Title { get; } Отображаемое имя объекта.
public IDictionary<string, object> Attributes { get; } Словарь атрибутов объекта, в котором ключ — имя атрибута.
public IList<INFile> Files { get; } Список текущих файлов.
public IList<INFilesSnapshot> FilesSnapshots { get; } Список предыдущих версий файлов.
public IDictionary<int, Access> Access { get; } Словарь прав доступа к объекту, в котором ключ — идентификатор организационной единицы, а значение — уровень доступа.
public bool IsSecret { get; } Определяет, является ли объект скрытым.
public bool IsDeleted { get; } Определяет, является ли объект безвозвратно удаленным
public bool IsInRecycleBin { get; } Определяет, является ли объект удаленным в корзину.
public IList<RObject> Children { get; } Коллекция дочерних объектов.
public IList<RObject> SourceFiles { get; } Коллекция объектов, с которыми установлена связь типа Исходный файл.
public IList<RPerson> Subscribers { get; } Список подписчиков на объект.
public IList< RRelation> Relations { get; } Горизонтальные связи объекта.

Класс RChatMessage

Представляет собой сообщение.

Члены класса Описание
public Guid Id { get; } Идентификатор сообщения.
public Guid CreatorId { get; } Идентификатор пользователя, создавшего сообщение.
public RPerson Creator { get; } Пользователь, создавший сообщение.
public int Type { get; } Тип сообщения. Возможные значения:
RMessageType.TextMessage = 0 - Текстовое сообщение,
RMessageType.ChatCreation = 1 - Сообщение создания чата,
RMessageType.ChatMembers = 2 - Сообщение редактирования участников чата: добавление/удаление/редактирование,
RMessageType.MessageRead = 3 - Сообщение о прочтении другого сообщения,
RMessageType.MessageAnswer = 4 - Сообщение-ответ на другое сообщение,
RMessageType.ChatChanged = 5 - Сообщение редактирования чата,
RMessageType.ChatRelation = 6 - Сообщение о добавлении связи,
RMessageType.MessageDropUnreadCounter = 7 - Сообщение о сбросе счетчика непрочитанных сообщений,
RMessageType.EditTextMessage = 8 - Отредактированное текстовое сообщение (свойство Text такого типа сообщения содержит отредактированный текст)
public DateTime Date { get; } Дата создания сообщения на сервере.
public string Text { get; } Текст сообщения. Заполнен только для сообщения с типом 0 и 8.
public IEnumerable<RChatMessage> RelatedMessages { get; } Коллекция связанных сообщений.

Класс RChatInfo

Представляет собой чат.

Члены класса Описание
public Guid Id { get; } Идентификатор чата.
public string Name { get; } Наименование чата.
public string Description { get; } Описание чата.
public Guid CreatorId { get; } Идентификатор пользователя, создавшего чат.
public RPerson Creator { get; } Пользователь, создавший чат.
public int Type { get; } Тип чата.
public Guid? LastMessageId { get; } Идентификатор последнего сообщения в чате.
public DateTime CreationDateUtc { get; } Дата создания чата.

Класс RType

Представляет собой тип объекта.

Члены класса Описание
public int Id { get; } Идентификатор типа.
public string Name { get; } Имя типа.
public string Title { get; } Отображаемое имя типа.
public byte[] Icon { get; } Иконка типа в формате SVG.
public int Sort { get; } Содержит порядковый номер сортировки.
public bool HasFiles { get; } Определяет, может ли объект этого типа содержать файлы.
public bool IsDeleted { get; } Определяет, был ли удален тип.
public TypeKind Kind { get; } Определяет, является ли тип пользовательским или системным.
public bool IsMountable { get; } Определяет, может ли объект этого типа быть смонтирован на диск.
public bool IsService { get; } Определяет, является ли тип сервисным (скрытым от отображения).
public IList<NAttribute> Attributes { get; } Возвращает список атрибутов типа.
public IList<RType> Children { get; } Возвращает коллекцию дочерних типов.

Класс NAttribute

Представляет собой атрибут типа.

Члены класса Описание
public string Name { get; } Имя типа.
public string Title { get; } Отображаемое имя типа.
public bool Obligatory { get; } Определяет, является ли атрибут обязательным к заполнению.
public int DisplaySortOrder { get; } Содержит порядковый номер сортировки атрибута при отображении.
public bool ShowInTree { get; } Определяет, будут ли отображаться атрибут в карточке объекта.
public bool IsService { get; } Определяет, является ли атрибут сервисным.
public string Configuration { get; } Дополнительные параметры атрибута.
public MAttrType Type { get; } Тип атрибута. Возможные значения:
Integer,
Double,
DateTime,
String.
public int DisplayHeight { get; } Количество строк, зарезервированных для отображения атрибута строкового типа.

Класс RRelation

Представляет собой горизонтальную связь между объектами.

Члены класса Описание
public Guid Id { get; } Уникальный идентификатор связи.
public RelationType Type { get; } Получение типа связи:
  • SourceFiles - связь с исходным файлом,
  • TaskAttachments - вложение в задание,
  • Custom - пользовательская связь.
public RRelation Target { get; } Получение связанного объекта.
public string Name { get; } Наименование связи.

Класс RPerson

Представляет собой пользователя.

Члены класса Описание
public int Id { get; } Идентификатор пользователя.
public string Login { get; } Логин пользователя.
public string DisplayName { get; } Отображаемое имя пользователя.
public string Comment { get; } Комментарий к пользователю.
public string Sid { get; } Идентификатор пользователя из Active Directory.
public bool IsDeleted { get; } Определяет, был ли удален пользователь.
public bool IsAdmin { get; } Определяет, является ли пользователь администратором.
public ROrganisationUnit MainPosition { get; } Основная должность пользователя.
public IList<ROrganisationUnit> Positions { get; } Список всех должностей, на которых состоит пользователь.

Класс ROrganisationUnit

Представляет собой организационную единицу (должность или подразделение).

Члены класса Описание
public int Id { get; } Идентификатор организационной единицы.
public string Title { get; } Отображаемое имя организационной единицы.
public bool IsPosition { get; } Определяет, является ли организационная единица должностью. Значение false означает, что организационная единица является подразделением.
public bool IsDeleted { get; } Определяет, была ли удалена организационная единица.
public RPerson Person { get; } Возвращает пользователя, состоящего на должности.
public IList<ROrganisationUnit> Children { get; } Список дочерних организационных единиц подразделения.

Класс LongRunning

Выполнение скриптов отчёта происходит в UI потоке, поэтому выполнение длительных операций (поисковые запросы, работа с файлами и т.д.) может приводить к неотзывчивости пользовательского интерфейса во время построения отчёта. Для обеспечения отзывчивости интерфейса длительные операции необходимо запускать с помощью статического метода LongRunning.Start(ScriptingReport, Action).

Пример:

LongRunning.Start(this, () => {

    var currentPerson = context.CurrentPerson;

    var builder = QueryBuilder.CreateEmptyQueryBuilder();

    builder.Must(AttributeFields.DateTime("dateOfAssignment"). BeInRange(DateTime.UtcNow.AddDays(-14), DateTime.UtcNow));

    builder.Must(AttributeFields.OrgUnit("executor").Be(currentPerson.Id));

    builder.MustNot(AttributeFields.State("state").Be(SystemStates. NEXTTASK_REVOKED_STATE_GUID));

    context.Objects = context.GetObjects(builder);

    DataSource = context;

});

 

Поисковые запросы

Основой для составления поискового запроса является fluent интерфейс IQueryBuilder, который представляет собой конструктор запросов на основе различных условий.

При добавлении нескольких условий попадание в результаты поиска осуществляется только при одновременном выполнении всех условий.

Члены IQueryBuilder

Члены класса Описание
IQueryBuilder Must(ISearchTerm term) Определяет условие, значение которого должно соответствовать истине для попадания в результаты поиска.
IQueryBuilder MustAnyOf(params ISearchTerm[] terms) Определяет набор условий, при выполнении хотя бы одного из которых происходит попадание в результаты поиска.
IQueryBuilder MustNot(ISearchTerm term) Определяет условие, значение которого должно соответствовать "ложь" для попадания в результаты поиска.

Статические методы для создания экземпляра IQueryBuilder

Метод Описание
QueryBuilder.CreateObjectQueryBuilder() Создает конструктор поискового запроса для объектов. Содержит в себе предустановленные условия для попадания в поисковую выдачу только неудалённых объектов пользовательских типов.
QueryBuilder.CreateEmptyQueryBuilder() Создает пустой конструктор поискового запроса. Может быть использован для сложных сценариев поиска.

Конструирование условия поиска для объектов

Основа Конструкция
Идентификатор объекта. var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(ObjectFields.Id.Be(objId));

Идентификатор родительского объекта. var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(ObjectFields.ParentId.Be (parentId));
Идентификатор типа объекта. var type = context.GetType("document");
var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(ObjectFields.TypeId.Be(type.Id));
Пользователь-создатель объекта. var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(ObjectFields.CreatorId.Be (context.CurrentPerson.Id));
Дата создания объекта. var to = DateTime.UtcNow;
var from = to.AddDays(-5);
var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(ObjectFields.CreatedDate.BeInRange (from, to));
Признак, является ли объект скрытым. var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(ObjectFields.IsSecret.Be (true));
Признак, что любой атрибут содержит текстовое значение. var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(ObjectFields.AllText.Be ("конструк*"));
Значение конкретного атрибута: Строкового var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(AttributeFields.String("Name") .Be("конструк*"));
Целочисленного var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(AttributeFields.Integer("Code") .Be(5));
С плавающей запятой var builder = QueryBuilder.CreateObjectQueryBuilder();
builder.Must(AttributeFields.Double("Price") .BeInRange(3.5, 8.9));
Даты var to = DateTime.UtcNow;
var from = to.AddDays(-5);
var builder = QueryBuilder .CreateObjectQueryBuilder();
builder.Must(AttributeFields.DateTime("Hired").BeInRange(from, to));

Отладка скриптов отчёта

Для включения отладки скриптов необходимо отредактировать конфигурационный файл Pilot-ICE Enterprise. Данный файл может быть найден по пути: %PROGRAMFILES%\ASCON\Pilot-ICE Enterprise\Ascon.Pilot.PilotEnterprise.exe.config. В файле необходимо раскомментировать секцию:

<system.diagnostics>

<switches>

<add name="AllowDebugXtraReportScripts" value="BreakWhenDebuggerAttached"/>

</switches>

</system.diagnostics>

Для отладки скриптов требуется Microsoft Visual Studio 2017 и старше.

Для начала отладки скриптов необходимо присоединиться к процессу Pilot-ICE Enterprise. Для этого в Visual Studio нажмите Отладка (Debug)Присоединиться к процессу... (Attach to Process...) и в появившемся диалоге выберите процесс Ascon.Pilot.PilotEnterprise. После успешного присоединения к процессу вызовите команду построения отчёта в Pilot-ICE Enterprise. В Visual Studio автоматически сработает точка останова на конструкторе скрипта отчёта.