Skip to main content

Пакет @morphcluster/carabi

Документация сервисов хоста PgDocuments

Обзор

ПХост PgDocuments предоставляет клиентские обёртки, хелперы и утилиты для работы с базой данных, документами, справочниками и миграциями.

Клиенты удалённых сервисов

Все клиенты предоставляют методы, соответствующие удалённым запросам:

  • OraLongTransactions - клиент для упработы с двлинными транзакциями Oracle-адаптера. (см. хост Postgres).
  • OraQueries - клиент для выполнения обычных (без транзакций) запросов в стиле Oracle.
  • PgQueryPool - клиент для работы с прямым пулом PostgreSQL (если используется режим pg).
  • Documents - низкоуровневая работа с информационными объектами (документами) бв систезме MorphCluster. Основная функциональность включалидацииет:

    и
      проверки
    • Управ.
    • DocumentLists - расширленныие запструктуросый стиписков документов с(DocKind) фильтрацией по статусам.
    • DockindStructure - работа со структурой информационных объектов (типы, свойства, статусы, действия, права).

    Утилиты SQL

    SqlQuery

    Назначение: пдострупа

  • Рабоениета сложных SQL-запросов программным способом. Поддерживает SELECT, FROM, JOIN, WHERE, ORDER BY, LIMIT/OFFSET.

    const q = new SqlQuery()
      .select(['u.id', 'u.name'])
      .from('users', 'u')
      .leftJoin('orders', 'o', new WhereCondition('simple', 'u.id = o.user_id'))
      .orderBy('u.name');
    
    const sql = q.build({ pretty: true });
    

    Подробнее в отдельном документе

    ами

    SqlModify

    Назначение: упрощает создание запросов INSERT и UPDATE.

    const mod = new SqlModify('users');
    mod.set('name', 'varchar2', 'Alice');
    mod.set('age', 'number', 30);
    mod.setId('id', 'number', 123);
    const { sql, params } = mod.getUpdateQuery();
    

    Мечтоды:

    рт
    МетодОписание
    set(column, type, value)Задать значение, обновление, удаление
  • Импорт/эксполонки
  • setId(column, type, value)Зметадатьнных и данных в XML/JSON
  • Генерация и синхронизация таблиц документификатор записи
  • getInsertQuery()Возвращает {sql, params} для INSERT ... RETURNING
    getUpdateQuery()Возвращает {sql, params} для UPDATE

    Параметры формируются в видеPostgreSQL

  • { name, type, value }, совместимом с QueriesHelper.

    Сервисы-помошники

    QueriesHelper

    универсальный сервис-помощник для в

  • Выполнения запросов ке баизне данныхс-логики через функции и действия

Структура сервисов

Клиентыбр (ServiceNats)

Клиенты не описываются в данныой документадаптерции, (oraно они исполи pg). Являеьзуются псервисами для медпжсервисночтительным спгособом взаимодействия:

  • Eventer — отправка событий, БД управление пользовательскими соединениями
  • SysProcesses — управленикле фоновыми бизнес-процессадми

Основныхе сервисах.

Подробнее смотрите в отдельном разделе

ы

OLTHelper1. DockindStructure

УОтветственность: Упраревший, сейчас его замленил QueriesHelper. Класс-помощник для упрощённой работы с длинными транзакциями (OraLongTransactions).

Не является сервисом, это обычный класс, который нужно создавать вручную.

Конструктурой типов документов (DocKind): статусы, свойства, функции, действия, права доступа, правила именования.

Зависимости: QueriesHelper, OraLongTransactions, SysProcesses

События:

new OLTHelper(oltServiceInstance, workspace, oltId?, log, options?)
  • oltServiceInstanceonChanged экземпляр клигента OraLongTransactions.
  • workspace – ерабочируее пространство (обычно "main").
  • oltId – ID существующей транзакции (если не указана, создаётся автоматически при первлюбом визменении структурыз типа довкуме).
  • log – экземпляр Logger.
  • options – { userId?, noUser? }.нта

Основные методы:

Метод Описание
create()Явно создать транзакцию
getResult()Дождаться результата последнего выполнения
fetch(OutParams, count)Извлечь строки курсора после выполнения
execFuncMulti(queryName, params)Выполнить функцию и вернуть объект с выходными параметрами
execFunc(queryName, params)Выполнить функцию и вернуть первое выходное значение
selectFunc(queryName, params, count)Выполнить функцию и вернуть сфетченные строки курсора
selectRowFunc(queryName, params)Выполнить функцию и вернуть первую строку курсора
execSql(sql, params)Выполнить SQL
selectSql(sql, params, count)Выполнить SQL и вернуть сфетченные строки
selectRowSql(sql, params)Выполнить SQL и вернуть первую строку
commit()Зафиксировать транзакцию
rollback()Откатить транзакцию

Методы автоматически вызывают create(), если транзакция ещё не создана.

Пример:

const olt = new OLTHelper(this.OraLongTransactions, 'main', null, log, getInfo({ noUser: truedocKind });
await olt.execFunc('PKG_TEST.DO_SOMETHING', { param1: 1 });
const rows = await olt.fetch(olt.result, 100);
await olt.commit();

Работа с документами

DockindCache

Сервис кэширования метаданных типов документов (DocumentKind) и имён справочников. Автоматически сбрасывает кэш при получении события onChanged от DockindStructure.

Методы:

числ docKinddocKindId
МетодСигнатураОписание
get(log, docKindName)(log, name) → DocumentKind Получить базовую информацию о типе докэшумента (ID, описание)
setMain({ oldDocKind, newDocKind, description, parentId })Обновить основную информацию (только описание и родительскую папку)
getStatuses({ docKind, docKindId })Получить список статусованный объекытий) типа документа
getById(log,setStatuses({ docKindId)docKind, deleteIds, statuses, newOrder }) Обновить статусы: удалить, изменить, добавить, переупорядочить
(log,getProps({ id)docKind, docKindId DocumentKind}) Получить список свойств типа документа
setProps({ docKind, props, deleteIds })Обновить свойства: удалить, изменить, добавить
setProperty({ docKindId, property })Внутренний метод для сохранения одного свойства с его статусными масками и ссылками
getFunctions({ docKind, docKindId })Получить функции, привязанные к типу документа
setFunctions({ docKind, funcs, deleteIds })Обновить функции (DB или CSP) с их привязкой к статусам и свойствам
setActions({ docKind, deleteIds, actions })Обновить действия (переходы между IDстатусами)
setNames({ docKind, names })Обновить правила именования документов
setPermissions({ docKind, roles, deleteRoleIds })Установить права доступа для ролей (создание, видимость/редактирование статусов и свойств)
getIdByName(log,{ docKindName) (log, name) → number}) Получить ID типа документа по имени
getNameById(log,{ docKindId) (log, id) → string}) Получить имя типа документа по ID
clearCache(updateDockindNames({ dockindId }) ПриОтложенудительное обновление описбросанитьй всех докэшументов типа
createDbFunction({ schema, name })Создать пустую PL/pgSQL-функцию, если она не существует

DocumentKind2. Documents

Ответственность: Низкоуровневая работа с документами — чтение/запись значение: представляет метаданные одного типай, информационногя о объекта (документа).е, Загпружается из БД човерезка CSP_DOCUMENTS.GET_DOCKIND_INFO и свобязанныте запросы.

Конструктор:

new DocumentKind(queriesHelper)

После создания нужно вызвать await docKind.load(log).

Основные свойства (после загрузки):

  • name, id, description, tableName
  • properties – массив DocProperty
  • propEvents – массив DocEventProperty
  • statuses – массив объектов {id, name, descr}

Методы:

  • getTableName() – имя таблицы БД для этого типа.
  • getPropFieldName(prop) – имя колонки для свойства.
  • getUniqueProps() – массив уникальных свойств.

Класс DocProperty:

{
  id, name, fieldName, propKind,
  formatBase, formatLogic,
  object, multi, unique,
  fpath, SQL, rule, raw
}

Класс DocEventProperty:

{
  propId, statusId,
  writable, readable, notNull
}

Справочники

VocabsHelper

Назначение: сервис для загрузки и кэширования справочников.

Методы:

МетодСигнатураОписание
getVocab(log, vocabName)→ VocabПолучить загруженный справочник по имени

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


Vocab

Назначение: представляет один справочник (простейшая модель).

Конструктор: new Vocab(name, queriesHelper)

Методы:

  • load(log) – загружает ID справочника по имени.

Свойства после загрузки: id, name, loaded = true.


Document

Назначение: представляет один экземпляр информационного объекта с кэшированием значений и отслеживанием изменений.

КЗависимонструктори: QueriesHelper, DockindCache

new Document(log, session, docKind, { Documents, QueriesHelper, trxId? })

Основные методы:

setValues({values рамках
Метод Описание
loadFromJson(data)getInfo({ documentId }) ЗагрПолузчить основную информацию о документе (тип, статус, дата, создатель)
getDescr({ documentId })Получить описанныие из добъкумекнта (сгенериробычванно после по прависклам именования)
getValues(propNames){ dockind, documentId, propNames }) Получить значения указанных свойств документа (споддерживает кэшипровастые и ссылочниыем поля)
getValue(propName) Получитьdockind, одноdocumentId, значение
setValues(values, autocommit?}) Установить значения (свойств документакапливаются в valuesChanged)
commitValues()Сохтранить нзакопленные цизменения в БД
insertRefs({ dockind, documentId, propName, values)values }) Добавить ссылки
setStatus(newStatusName)Изменить статус докрумента

Пример:

const doc = new Document(log, session, dockind, { QueriesHelper: this.QueriesHelper, Documents: this.Documents, trxId });
doc.id = 123;
await doc.getValues(['Name', 'Age']);
await doc.setValues({ Name: 'Alice' }); // изменится, но не сохранено
await doc.setValues({ Age: 30 }, false); // ещё измененгие
await doc.commitValues(); // одно сохранение двух полей

DocumentsHelper

Назначение: высокоуровневый сервис для работы с документами. Создаёт документы в множественное ссылочное поле deleteRefs({ dockind, documentId, propName, values }) Удалить указанные ссылки из множественного ссылочного поля checkNull({ dockind, documentId }) Проверить, загружает их по ID, выполнены ли обязательные для текущего статуса поля


3. DocumentLists

Ответственность: пПоиск и выборка списков документов по значениям свойств.

МЗависимости: QueriesHelper, DockindCache, Documents

Основные методы:

Метод СОписание
listIdByProps({ dockind, values, statuses, notStatuses, count })Найти ID документов по значениям свойств (AND-условия)
listPropsByProps({ dockind, props, filter, statuses, notStatuses, count })Выбрать документы с указанными полями для вывода
listByUniqueFields({ dockind, values })Найти документы по уникальным полям (автоматически определяются по конфигурации)
getUniqueCollisions({ dockind, documentId })Найти документы с конфликтами по уникальным полям (исключая переданный ID)

4. DocumentFuncs

Ответственность: Выполнение бизнес-функций, привязанных к статурсам и свойствам документов.

Зависимости: QueriesHelper, DockindCache, Documents, GlobalServices, Eventer

Основные методы:

Метод Описание
createDocument(log,processStatus({ dockind, documentId, statusName, params, session, docKindName,postprocess trxId?}) Выполнить все функции, привязанные к указанному статусу (pre- или post-process)
processProperty({ Documentdockind, documentId, propName, session })Выполнить функции, привязанные к изменению свойства
processAnykindFuncs({ dockind, documentId, params, session })Выполнить глобальные (anykind) функции для документа
runFunc({ func, dockind, documentId, params, session, trxId })Выполнить конкретную функцию (DB или CSP)

Поддерживаемые типы функций:

  • DB — вызов хранимой процедуры PostgreSQL (формат schema.function)
  • CSP — вызов метода удалённого сервиса (формат ServiceName.method)

5. DocCardValues

Ответственность: Высокоуровневая работа со значениями документов в контексте карточки (UI-транзакции).

Зависимости: QueriesHelper, DockindCache, Documents, DocumentFuncs, DocumentLists

Основные методы:

МетодОписание
getValDisplay({ documentId, propName })Получить отображаемое значение поля (например, имя справочника вместо ID)
getValues({ documentId, propName })Получить массив значений простого поля
setValues({ cardId, documentId, propName, value/values })Установить значения простого поля в рамках карточной транзакции
getRefs({ documentId, propName })Получить список связанных документов для ссылочного поля
setRefs({ cardId, documentId, propName, refDocumentIds })Заменить весь список связанных документов
clearRefs({ cardId, documentId, propName })Очистить ссылочное поле
insertRefs({ cardId, documentId, propName, refDocumentIds })Добавить ссылки в множественное поле
deleteRefs({ cardId, documentId, propName, refDocumentIds })Удалить указанные ссылки
createRefDoc({ cardId, documentId, propName, parentId }) Создать новый документ, привязанный к ссылозвращаетчному побъект Documentлю
loadDocument(log,deleteRefDocs({ session, docKindName,cardId, documentId, trxId?propName, refDocumentIds }) Удалить связанные документы (полное удаление)
commit({ DocumentcardId }) Загфиксировать транзакцию карточки (проверка обязательных полей и узникальности)
rollback({ cardId })Откатить сущтранзакцию карточки

6. DocCardActions

Ответственность: Выполнение действий (переходов междующ статусами) с документами.

Зависимости: QueriesHelper, DockindCache, Documents, DocumentFuncs, DocCardValues, SysProcesses, DocumentLists

Основные методы:

МетодОписание
runActions({ dockind, documentIds, actionId, actParams, cardId, session })Выполнить действие над одним или несколькими документами
runAction({ dockind, documentId, action, actParams, cardId, session })Внутренний метод выполнения одного действия (проверка статуса, смена статуса, вызов функций)
runGlobalAction({ action, actParams, cardId, session })Выполнить глобальное действие (без привязки к документу)
create({ dockind, parentId, classifPropId, classifId, session })Создать новый документ с опциональным родителем и классификатором
loadDocList(log,deleteDocs({ session,dockind, docKindName,documentIds, options)session }) Пометить документы как удалённые и запустить фоновую очистку
processDelete({ Document[]dockind, documentId, session }) Отложенная постобработка удаления (вызов функций статуса "deleted", физическое удаление)

Логика действия:

  1. Проверка допустимости текущего статуса (FROM_STATUS_IDS)
  2. (Опционально) Смена статуса на TO_STATUS_ID с вызовом pre-process функций
  3. (Опционально) Вызов функции, привязанной к действию
  4. Запуск post-process функций для нового статуса
  5. Запуск глобальных (anykind) функций

7. DocTables

Ответственность: Генерация и синхронизация струзктур таблить списокц документов в PostgreSQL для быс фильтрого поиска и отчетов.

Зависимости: QueriesHelper, OraLongTransactions, DockindCache

Основные методы:

МетодОписание
recreate({ docKind })Полностью пересоздать таблицу, представление и процедуру синхронизации для типа, затем синхронизировать все данные
recreateStruct({ docKind })Пересоздать только структуру таблицы (без представления и данных)
recreateView({ docKind })Пересоздать представление для типа документа (объединяет основную таблицу и словари)
recreateAll({})Пересоздать структуры для всех типов документов (последовательно)
createSyncProcedure({ dockind })Сгенерировать PL/pgSQL-процедуру синхронизации для типа
documentSync({ docKind, documentId })Синхронизировать один документ с его таблицей
getDocKindByDocumentId(log,documentSyncKind({ documentId)docKind }) Синхронизировать все документы указанного типа (пакетная обработка)

Архитектура таблиц:

  • Основная таблица: doc_tables.<dockind>_t DocumentKind— содержит single-свойства
  • Дочерние таблицы: doc_tables.<dockind>_t_<prop> — для multi-свойств
  • Представление: doc_tables.<dockind>_v — объединяет данные для удобного чтения

8. DockindImporter

Ответственность: Импорт метаданных из XML и JSON в базу данных.

Зависимости: DockindStructure, QueriesHelper, DocumentsHelper, OraLongTransactions

Основные методы:

МетодОписание
importXml({ root, vocabs, types }) ПИмпорт структуры из XML (случоварить + типы документов)
importJson({ root, data })Импорт структуры из JSON

Внутренние классы:

  • XmlImporter — парсинг XML, создание/обновление словарей, типов, статусов, свойств, действий, имён, функций
  • JsonImporter — аналогичный функционал для JSON (более современный формат)

Поддерживаемые сущности при импорте (JSON):

  • Словари (vocabs)
  • Типы документов (name, descr)
  • Статусы (statuses с цветами, функциями, правами)
  • Свойства (props с типом, мульти, уникальностью, статусными масками, ссылками, правами, функциями)
  • Правила именования (names)
  • Действия (actions с условиями, переходами, правами, функциями)
  • Права доступа (permissions на уровне ролей)

9. DockindExporter

Ответственность: Экспорт метаданных типа документа в JSON.

Зависимости: DockindStructure, QueriesHelper, DocumentsHelper, OraLongTransactions

Основные методы:

МетодОписание
exportJson({ dockind })Экспортировать полную структуру типа документа в JSON

Внутренний класс: JsonExporter

Экспортируемые данные:

  • Основная информация (name, descr)
  • Используемые словари (vocabs со значениями)
  • Статусы (statuses с цветами, правами, функциями)
  • Свойства (props с типами, параметрами, статусными масками, ссылками, правами, функциями)
  • Правила именования (names)
  • Действия (actions с условиями, переходами, правами, функциями)

10. DocDataImporter

Ответственность: Импорт данных документов из внешних источников (XML).

Зависимости: QueriesHelper, DocumentsHelper, DockindCache, Documents

Основные методы:

МетодОписание
importXml({ dataXml, uniqueProps })Импортировать данные документов из XML

Логика импорта:

  1. Парсинг XML, извлечение структуры документов
  2. Для каждого документа:
    • Поиск существующего документа по ID эуникзеальнымпляра

      Параметры loadDocList:

      {
        props: ['Name', 'Age'],     // полям д(есля выборки filter: { Name: 'Alice' },  // фильтр
        statuses: ['Active'],       // огруказаны)
    • Еслич найден — применение правил слияния (добавление, перезапись, стирание)
    • Если не найден — создание нового документа
  3. Заполнение свойств документа (включая ссылки на подчинённые документы)
  4. Установка статуса

Правила слияния:

  • 0 — значение не меняется
  • notStatuses:
  • ['Deleted'],2 //— добавление новых значений в множество
  • 3 — перезапись значения
  • 4 — стирание значения

Вспомогательные модули

db-functions.mjs

Содержит определения SQL-функций для csp_documents (схема CSP-документов). Эти функции используются сервисами для работы с базой данных:

  • get_all_dockinds — получить все типы документов
  • get_document_info — получить информациюч о документе
  • get_dockind_id_by_name / get_dockind_name_by_id — преобразование ID/имыени
  • get_dockind_props — свойства типа документа
  • get_dockind_prop_events — статусные count:маски 100,свойств
  • trxId:
  • nullget_document_values }/ get_document_refs — чтение значений и ссылок
  • и другие

DocFunctionsInstaller

Наследуется от DbFunctionsInstaller и устанавливает функции из db-functions.mjs при старте сервиса.