Модуль взаимодействия с ядром ЛИС: различия между версиями
Sidminik (обсуждение | вклад) |
Sidminik (обсуждение | вклад) |
||
| Строка 641: | Строка 641: | ||
options: PopupOptions Параметры всплывающего сообщения | options: PopupOptions Параметры всплывающего сообщения | ||
<syntaxhighlight lang="javascript"> | |||
interface PopupOptions { | interface PopupOptions { | ||
showingTimeMs: number; | showingTimeMs: number; | ||
} | } | ||
</syntaxhighlight> | |||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
Версия от 04:59, 13 января 2026
Модуль @chemsof/chemic дает доступ к ядру ЛИС из node, по сути являясь оберткой над chemic.dll, обращаясь к его методам через Chemic API. Модуль поделен на пространства имен и классы.
Принятые обозначения в заголовках и оглавлении:
Something(): метод, функция, что-то, что можно вызвать, сигнатура может не совпадать
EXP: Фича с экспериментальной поддержкой
READONLY: свойство только для чтения
Быстрый старт
Установка
Настроить подключение npm-registry из GitLab (для инструкций см. сам репозиторий npm-registry)
После этого для Установка модуля пишем
npm i @chemsoft/chemic
Подключение
Модуль подключается из кода следующим образом:
const chemic = require('@chemsoft/chemic')
Теперь обращаясь к chemic можно взаимодействовать с ядром ЛИС.
Инициализация ядра
Подключение к БД
По умолчанию строка подключения БД считывается из реестра ветки ЛИС (\HKCU\SOFTWARE\НИИ ВН\АРМ «Химик-аналитик»\Connect или аналогичный ключ в HKLM).
Для изменения строки подключение можно передать кастомную через переменную среды CONNECTION_STRING.
Например:
set CONNECTION_STRING=Provider=SQLNCLI11.1;Password=1;User ID=ch_ttg2_barabinsk;Data Source=MSSQL08;Application Name=LISChemic;MARS Connection=True
# Теперь можно запускать скрипт
Пользовательская часть
- По идентификатору
Передача переменных среды
set LIS_USER_ID=777
# Теперь можно запускать скрипт
Установка значений в глобальном объекте
global.LIS_USER_ID = 777;
const chemic = require("@chemsoft/chemic");
- По логину и паролю
При инициализации по логину и паролю существует два варианта аутентификации:
- Прямой (
raw) - в данном случае при аутентификации сверяется только пароль и никакие доп. проверки не осуществляются; - Стандартный (
default) - стандартный способ аутентификации, аналогичный входу в ЛИС через обычный лаунчер.
Передача переменных среды
# Вариант аутентификации
set LIS_CREDENTIAL_INITIALIZE_MODE=raw
# set LIS_CREDENTIAL_INITIALIZE_MODE=raw
# Учетные данные
set LIS_USER_LOGIN=test_user
set LIS_USER_PASSWORD=1
# Пароль также может быть пустым или не указан (эквивалент пустому)
# set LIS_USER_PASSWORD=
# Теперь можно запускать скрипт
Установка значений в глобальном объекте
global.LIS_CREDENTIAL_INITIALIZE_MODE = "default";
global.LIS_USER_LOGIN = "test_user_simple";
global.LIS_USER_PASSWORD = ""; // Пустой пароль
const chemic = require("@chemsoft/chemic");
Пространство имен Session
Пространство имен Session дает доступ к текущей сессии пользователя.
Вложенное пространство имен Session.user
Внутри Session.user хранится информация о пользователе текущей сессии
Session.user.name хранит в себе строку с ФИО пользователя
Session.user.id идентификатор пользователя
Session.user.roles.id идентификатор роли пользователя
Session.user.roles.name название роли
Session.user.roles.banned флаг бана роли
Свойство Session.labId
Session.labId идентификатор лаборатории
Пространство имен User
User.hasRole() Проверка на то, имеет ли пользователь указанную роль
param: idOrName Идентификатор или имя роли
param: ignoreBanned Игнорирует при рассмотрении заблокированные роли
return: boolean Возвращает true, если пользователь имеет указанную роль, false - если нет
User.hasRole(idOrName: number | string, ignoreBanned?: boolean): boolean;
Пространство имен SecurityStorage
Пространство имен SecurityStorage дает доступ защищенному хранилищу пользователя. Защищенное хранилище место где пользователь может хранить какую-то чувствительную информацию в словарном представлении (ключ-значение).
SecurityStorage.isPathExist()
Проверка существования файла по пути из защищенного хранилища (ЗХ), также можно задать имя файла, которое добавится к директории из ЗХ
param: pathKey Ключ из ЗХ, по которому хранится полный путь к файлу или директории
param: filename Имя файла (необязательно)
return: boolean Результат проверки существования пути
SecurityStorage.isPathExist(pathKey: string, filename?: string): boolean
SecurityStorage.readFileContent()
Синхронное чтение данных из файла по пути из ЗХ, также можно задать имя файла, которое добавится к директории из ЗХ
param: pathKey Ключ из ЗХ, по которому хранится полный путь к файлу или директории
param: filename Имя файла (необязательно)
return: string | null Содержимое файла
SecurityStorage.readFileContent(pathKey: string, filename?: string): string | null;
SecurityStorage.writeFileContent()
Синхронная запись данных в файл по пути из ЗХ, также можно задать имя файла, которое добавится к директории из ЗХ
param: pathKey Ключ из ЗХ, по которому хранится полный путь к файлу или директории
param: filename Имя файла (может быть null)
param: content Данные для записи в файл
SecurityStorage.writeFileContent(pathKey: string, filename: string | null, content: string): void;
SecurityStorage.copyFile()
Копирование файла по пути из ЗХ
param: srcPath Путь к файлу
param: dstPathKey Ключ из ЗХ, по которому хранится полный путь к директории
SecurityStorage.copyFile(srcPath: string, dstPathKey: string): void;
SecurityStorage.moveFile()
Перемещение файла по пути из ЗХ
param: srcPath Путь к файлу
param: dstPathKey Ключ из ЗХ, по которому хранится полный путь к директории
SecurityStorage.moveFile(srcPath: string, dstPathKey: string): void;
SecurityStorage.getKeyValue()
Получение значение из защищенного хранилища пользователя
param: key Ключ
return: string | null Значение (если есть)
SecurityStorage.getKeyValue(key: string): string | null;
Пространство имен Documents
Пространство имен Documents позволяет работать с документами ЛИС: создавать и экспортировать.
Documents.exportToPdf()
Экспортирует готовый документ в pdf
param: documentId Идентификатор готового документа (таблица dFormsDOX)
param: filePath Полный путь к файлу для экспорта (расширение .pdf)
Documents.exportToPdf(documentId: number, filePath: string): void;
Documents.exportToPdfAsync() EXP
Асинхронно экспортирует готовый документ в pdf
param: documentId Идентификатор готового документа (таблица dFormsDOX)
param: filePath Полный путь к файлу для экспорта (расширение .pdf)
param: callback Обработчик завершения операции
Documents.exportToPdfAsync(documentId: number, filePath: string, callback: (err?: Error) => void): void;
Documents.exportToPdfSecure()
Экспортирует готовый документ в pdf, в качестве пути используя значение из защищенного хранилища ЛИС
param: documentId Идентификатор готового документа
param: pathSecureKey Ключ защищенного хранилища, по которому хранится путь
param: fileName Имя файла для сохранения (расширение .pdf)
Documents.exportToPdfSecure(documentId: number, pathSecureKey: string, fileName: string): void;
Documents.exportToPdfSecureAsync() EXP
Асинхронно экспортирует готовый документ в pdf, в качестве пути используя значение из защищенного хранилища ЛИС
param: documentId Идентификатор готового документа
param: pathSecureKey Ключ защищенного хранилища, по которому хранится путь
param: fileName Имя файла для сохранения (расширение .pdf)
param: callback Обработчик завершения операции
Documents.exportToPdfSecureAsync(documentId: number, pathSecureKey: string, fileName: string, callback: (err?: Error) => void): void;
Documents.exportToXml()
Экспортирует готовый документ в файл XML (win1251)
param: id Идентификатор документа
param: path Путь к сохраняемому файлу
Documents.exportToXml(id: number, path: string): void;
Documents.extractToXml()
Экспортирует готовый документ в строку XML
param: id Идентификатор документа
Documents.extractToXml(id: number): string;
Класс Documents.Generator
Базовые типы, которыми оперирует класс
type GeneratorParameterType = null | number | string | { type: 'time' | 'date', value: Date };
interface GeneratorParameter {
readonly type?: 'number' | 'string' | 'date' | 'time';
readonly name: string;
readonly isComboBox: boolean;
readonly isReadOnly: boolean;
readonly value: number | string | Date;
readonly availableValues?: string[]; // Только для комбо (isComboBox === true)
readonly meta: {
readonly min?: number; // Минимальное значение числа (для type === 'number')
readonly max?: number; // Максимальное значение числа (для type === 'number')
readonly stringMaxLength: number;
},
}
Статические методы (методы класса)
Documents.Generator.create()
param: formId Идентификатор формы документа
Documents.Generator.create(formId: number): Generator;
Documents.Generator.createAsync() EXP
Асинхронное создание документа
param: formId Идентификатор формы документа
param: callback Обработчик завершения операции
Documents.Generator.createAsync(formId: number, callback: (err?: Error, generator?: Generator) => void): void;
Методы экземпляра (ex)
ex.getParameters()
Возвращает список параметров документа и информацию о них
ex.getParameters(): GeneratorParameter[];
ex.setParameter()
Устанавливает значение параметра для текстового поля ввода документа
param: parameterNumber Номер параметра
param: parameter Значение параметра
ex.setParameter(parameterNumber: number, parameter: GeneratorParameterType): Generator;
ex.setParameterByIndex()
Устанавливает значение параметра для выпадающего списка по индексу из списка доступных значений (GeneratorParameter.availableValues)
param: parameterNumber Номер параметра
param: valueIndex Индекс значения
ex.setParameterByIndex(parameterNumber: number, valueIndex: number): Generator;
ex.saveInDatabase()
Сохраняет документ в базе данных
return: number Идентификатор сохраненного документа
ex.saveInDatabase(): number;
ex.toPdf()
Экспортирует документ в формат pdf
param: filePath Путь к экспортируемому документу
ex.toPdf(filePath: string): Generator;
ex.toPdfAsync() EXP
Асинхронно экспортирует документ в формат pdf. Недоступно для вызова из планировщика.
param: filePath Путь к экспортируемому документу
param callback Обработчик завершения операции
ex.toPdfAsync(filePath: string, callback: (err?: Error, generator?: Generator) => void): void;
ex.toXlsx()
Экспортирует документ в формат xlsx
param: filePath Путь к экспортируемому документу
ex.toXlsx(filePath: string): Generator;
ex.toXlsxAsync() EXP
Асинхронно экспортирует документ в формат xlsx. Недоступно для вызова из планировщика (пока не обновлен экспорт до новой версии)
param: filePath Путь к экспортируемому документу
param: callback Обработчик завершения операции
ex.toXlsxAsync(filePath: string, callback: (err?: Error, generator?: Generator) => void): void;
ex.destroy()
Удаляет экземпляр документа, желательно вызывать, чтобы не занимать зря память.
ex.destroy(): void;
ex.toXml()
Экспортирует документ в файл XML (win1251)
param: filePath Путь к экспортируемому документу
ex.toXml(filePath: string): Generator;
ex.getXml()
Экспортирует документ в строку XML
ex.getXml(): string;
Пространоство имен Container
Входной параметр для исполняемой задачи элемента контейнера
interface InputParameter {
name: string;
value: null | number | boolean | string | Date;
}
Container.createRecord()
Создает экземпляр класса Record
recordName: string Имя основной записи
recordColumnsName: string[] Имена колонок для таблицы основных записей
Container.createRecord(recordName: string, recordColumnsName: string[]): Record;
Container.log()
Запись сообщения в журнал действий контейнера (QT_LOG)
messageData Контент для записи
Container.log(messageData: any): void;
Класс Container.Record
constructor()
recordName: string Имя основной записи в контейнере задач
recordColumnsName: Array<string> Имена колонок для таблицы элементов контейнера
new Container.Record(recordName: string, recordColumnsName: Array<string>);
ex.setExecutedTask()
Устанавливает задачу на исполнение для элементов основной записи контейнера
name: string Имя задачи (из дизайнера задач) для исполнения при выборе элемента
ex.setExecutedTask(name: string): void;
ex.setName()
name: string Имя задачи (из дизайнера задач) для исполнения при выборе элемента
ex.setName(name: string): void;
addItem()
Добавление элемента в контейнер
columnsValue: Array<null | number | boolean | string | Date> Значение колонок таблицы добавляемого элемента
inputParameters:Array<InputParameter> | null Значение входных параметров для исполняемой задачи
ex.addItem(columnsValue: Array<null | number | boolean | string | Date>, inputParameters?: Array<InputParameter> | null): void;
save()
Производит сохранение сформированной записи в базу данных
return: boolean Результат сохранения (успешно или нет)
ex.save(): boolean;
Пространство имен Scheduler
Scheduler.evalTask()
Исполняет задание планировщика по его имени
name: string Имя задачи
Scheduler.evalTask(name: string): void;
Пространство имен Forms
Даёт доступ к различным частям ЛИС, в основном позволяет открыть какой-либо журнал или калькулятор.
Базовые типы, принятые в пространстве имен
enum CalculatorFormType {
/**
* Стандартный калькулятор
*/
DEFAULT,
/**
* Табличный калькулятор
*/
TABLE,
}
type Names =
'ЛЖ' |
'ОА' |
'ЖРО1' |
'ЖРО2' |
'Химпосуда 2.0' |
'Методы' |
'Методики' |
'КонтрольныеТочки' |
'Лаборатории' |
'УнивСправочник' |
'ВЛК2Алгоритмы' |
'ВЛК2Процедуры' |
'ХимВ-ва2' |
'КаталогРеактивов2' |
'РеактивыФирм2' |
'ЖУХР2' |
'Растворы2' |
'ЖурналПриготовленияРастворов2' |
'КГ' |
'ГХ' |
'СМК2_Документ';
Forms.openContainer()
Открывает контейнер задач ЛИС
Forms.openContainer(): void;
Forms.openForm()
Открывает указанную форму ЛЖ на конкретной записи
formName: string Имя формы для открытия
recordId: number Идентификатор записи (0 для открытия последней записи)
Forms.openForm(formName: Names, recordId: number | 0): void;
Forms.openSmkJournal()
Открывает указанный журнал СМК на указанной записи
usId: number Идентификатор универсального справочника для журнала СМК
recordId: number Идентификатор записи в данном журнале СМК
function openSmkJournal(usId: number, recordId: number): void;
Forms.openLj()
Открывает указанный ЛЖ на последней записи
journalName: string Имя лабораторного журнала
Forms.openLj(journalName: string): void;
Forms.openLjRecord()
Открывает ЛЖ на основе записи из Journal_table_r
recordId: number Идентификатор записи ЛЖ
Forms.openLjRecord(recordId: number): void;
Forms.openCalculator()
Открывает калькулятор параллельного определения результата ЛЖ
parallelResultId: number Идентификатор параллельного определения
return: number Результат вычислений калькулятора
Forms.openCalculator(parallelResultId: number, calculatorFormType: CalculatorFormType): number;
Forms.openIndicatorsDistributionDialog()
Открывает диалог распределение показателей для записи в ЛЖ
journalRecordId: number Идентификатор записи ЛЖ
return: {isDialogCanceled: boolean, indicators: Indicator[]} Возвращает статус закрытия диалога (был ли отменен) и список показателей
Forms.openIndicatorsDistributionDialog(journalRecordId: number): {
isDialogCanceled: boolean;
indicators: Indicator[];
}
Forms.showPopup()
Выводит всплывающее уведомление в нижней правой части экрана
content: any Данные для вывода в всплывающем сообщении
options: PopupOptions Параметры всплывающего сообщения
interface PopupOptions {
showingTimeMs: number;
}
Forms.showPopup(content: any, options?: PopupOptions): void;