Аддоны: различия между версиями
Arhidiman (обсуждение | вклад) |
Arhidiman (обсуждение | вклад) |
||
| Строка 4: | Строка 4: | ||
[[Файл:check-registration-date.png|frame]] | [[Файл:check-registration-date.png|frame]] | ||
Проверяет, не истёк ли срок регистрации пробы. Сравнивает дату регистрации из указанного поля с текущей датой. Если прошло более заданного количества дней (по умолчанию — 10), выдаёт ошибку. В противном случае показывает сообщение об успешной проверке. | Проверяет, не истёк ли срок регистрации пробы. Сравнивает дату регистрации из указанного поля с текущей датой. Если прошло более заданного количества дней (по умолчанию — 10), выдаёт ошибку. В противном случае показывает сообщение об успешной проверке. | ||
<syntaxhighlight lang="typescript"> | |||
import { JournalRecordManager } from "../../src/servivces/worker/api/interactors" | |||
import { MessageBoxResults } from "@triteia/types-integration-gui" | |||
import { getDataFromDialog } from "../../src/gui/api" | |||
import { DialogType } from "@triteia/types-integration-gui" | |||
const config = { | |||
dateField: 'Дата регистрации', | |||
expirationLimit: 10, | |||
journalRecordId: 201, // Лаб. воздуха / Анализы завершены | |||
integrationResult: { message: 'Срок регистрации пробы не истёк !'} | |||
} | |||
const messages = { | |||
queryParamsNotFound: 'Отсутствуют необходимые параметры для выполнения аддона. Дальнейшее выполнение невозможно', | |||
socketNotFound: 'Отсутствует соединение с клиентом. Дальнейшее выполнение аддона невозможно', | |||
success: (recordId) => `Срок регистрации пробы не истёк ! Id записи ${recordId}`, | |||
expired: (limit, recordId) => `Срок регистрации пробы истёк!\nПрошло более ${ limit } дней с момента регистрации. Id записи: ${recordId}`, | |||
dateField: (dateField, stageName, journalRecordId) => [ | |||
`Не заполнено либо отсутствует поле "${dateField}"`, | |||
`в этапе "${stageName || ''}".\nId записи: ${journalRecordId}` | |||
].join(' ') | |||
} | |||
const errorHandlers = { | |||
queryParamsError: () => { | |||
throw new Error(messages.queryParamsNotFound) | |||
}, | |||
socketError: () => { | |||
throw new Error(messages.socketNotFound) | |||
}, | |||
dateError: (dateField, stageName, journalRecordId) => { | |||
throw new Error(messages.dateField(dateField, stageName, journalRecordId)) | |||
}, | |||
expirationError: () => { | |||
throw new Error(messages.expired(config.expirationLimit, config.journalRecordId)) | |||
} | |||
} | |||
const getSocketId = (queryParams: any) => { | |||
const socketId = Array.isArray(queryParams?.socketId) && queryParams?.socketId?.length ? queryParams?.socketId[0] : ''; | |||
if (!queryParams) errorHandlers.queryParamsError() | |||
if (!socketId) errorHandlers.socketError() | |||
return socketId | |||
} | |||
const getDaysByDate = (date: Date) => { | |||
const dayMs = 60 * 60 * 24 * 1000 | |||
const timestamp = date.getTime() | |||
return timestamp/dayMs | |||
} | |||
const getConfig = (type: DialogType, title: string, message) => { | |||
return { | |||
type, | |||
config: { | |||
title, | |||
message | |||
} | |||
} | |||
} | |||
const getExpirationOffset = (registrationDate: string) => { | |||
const regDate = new Date(registrationDate) | |||
const today = new Date() | |||
return getDaysByDate(today) - getDaysByDate(regDate) | |||
} | |||
const showErrorMessage = async (message: string, socketId) => getDataFromDialog(getConfig('confirm', 'Ошибка', message), socketId); | |||
const showSuccessMessage = async (message: string, socketId) => getDataFromDialog(getConfig('confirm', 'Внимание', message), socketId); | |||
async function main({ queryParams }) { | |||
const socketId = getSocketId(queryParams) | |||
try { | |||
const journalRecordManager = await JournalRecordManager(config.journalRecordId) | |||
const date = journalRecordManager.getFieldValue(config.dateField) | |||
if (!date) errorHandlers.dateError(config.dateField, journalRecordManager?.data?.stage?.stage?.name, config.journalRecordId) | |||
const expirationOffset = getExpirationOffset(date as string) | |||
if (expirationOffset >= config.expirationLimit) errorHandlers.expirationError() | |||
await showSuccessMessage(messages.success(config.journalRecordId), socketId) | |||
return config.integrationResult | |||
} catch (err) { | |||
await showErrorMessage(err.message, socketId) | |||
return { error: err.message } | |||
} | |||
} | |||
module.exports = { main } | |||
</syntaxhighlight> | |||
== Проверка заполненности полей показателей. <code>check-indicator-fields-filled</code> == | == Проверка заполненности полей показателей. <code>check-indicator-fields-filled</code> == | ||
Версия от 09:52, 1 апреля 2026
Список демонстрационных аддонов, показывающих возможности интеграционного сервиса.
Проверка даты регистрации. check-registration-date

Проверяет, не истёк ли срок регистрации пробы. Сравнивает дату регистрации из указанного поля с текущей датой. Если прошло более заданного количества дней (по умолчанию — 10), выдаёт ошибку. В противном случае показывает сообщение об успешной проверке.
import { JournalRecordManager } from "../../src/servivces/worker/api/interactors"
import { MessageBoxResults } from "@triteia/types-integration-gui"
import { getDataFromDialog } from "../../src/gui/api"
import { DialogType } from "@triteia/types-integration-gui"
const config = {
dateField: 'Дата регистрации',
expirationLimit: 10,
journalRecordId: 201, // Лаб. воздуха / Анализы завершены
integrationResult: { message: 'Срок регистрации пробы не истёк !'}
}
const messages = {
queryParamsNotFound: 'Отсутствуют необходимые параметры для выполнения аддона. Дальнейшее выполнение невозможно',
socketNotFound: 'Отсутствует соединение с клиентом. Дальнейшее выполнение аддона невозможно',
success: (recordId) => `Срок регистрации пробы не истёк ! Id записи ${recordId}`,
expired: (limit, recordId) => `Срок регистрации пробы истёк!\nПрошло более ${ limit } дней с момента регистрации. Id записи: ${recordId}`,
dateField: (dateField, stageName, journalRecordId) => [
`Не заполнено либо отсутствует поле "${dateField}"`,
`в этапе "${stageName || ''}".\nId записи: ${journalRecordId}`
].join(' ')
}
const errorHandlers = {
queryParamsError: () => {
throw new Error(messages.queryParamsNotFound)
},
socketError: () => {
throw new Error(messages.socketNotFound)
},
dateError: (dateField, stageName, journalRecordId) => {
throw new Error(messages.dateField(dateField, stageName, journalRecordId))
},
expirationError: () => {
throw new Error(messages.expired(config.expirationLimit, config.journalRecordId))
}
}
const getSocketId = (queryParams: any) => {
const socketId = Array.isArray(queryParams?.socketId) && queryParams?.socketId?.length ? queryParams?.socketId[0] : '';
if (!queryParams) errorHandlers.queryParamsError()
if (!socketId) errorHandlers.socketError()
return socketId
}
const getDaysByDate = (date: Date) => {
const dayMs = 60 * 60 * 24 * 1000
const timestamp = date.getTime()
return timestamp/dayMs
}
const getConfig = (type: DialogType, title: string, message) => {
return {
type,
config: {
title,
message
}
}
}
const getExpirationOffset = (registrationDate: string) => {
const regDate = new Date(registrationDate)
const today = new Date()
return getDaysByDate(today) - getDaysByDate(regDate)
}
const showErrorMessage = async (message: string, socketId) => getDataFromDialog(getConfig('confirm', 'Ошибка', message), socketId);
const showSuccessMessage = async (message: string, socketId) => getDataFromDialog(getConfig('confirm', 'Внимание', message), socketId);
async function main({ queryParams }) {
const socketId = getSocketId(queryParams)
try {
const journalRecordManager = await JournalRecordManager(config.journalRecordId)
const date = journalRecordManager.getFieldValue(config.dateField)
if (!date) errorHandlers.dateError(config.dateField, journalRecordManager?.data?.stage?.stage?.name, config.journalRecordId)
const expirationOffset = getExpirationOffset(date as string)
if (expirationOffset >= config.expirationLimit) errorHandlers.expirationError()
await showSuccessMessage(messages.success(config.journalRecordId), socketId)
return config.integrationResult
} catch (err) {
await showErrorMessage(err.message, socketId)
return { error: err.message }
}
}
module.exports = { main }
Проверка заполненности полей показателей. check-indicator-fields-filled

Проверяет заполненность полей показателей в записи журнала по настраиваемому списку. Проверяет наличие определённых показателей (например, "Аммоний-ион") и заполненность у них таких полей, как исполнители, методики, средний результат и др. Выдаёт ошибку, если показатели отсутствуют или не все поля заполнены.
Проверка заполненности атрибутов записи ЛЖ. check-record-fields-filled

Проверяет заполненность заданных полей в записи журнала (например, "Источник", "Место отбора", "Дата регистрации" и др.). Если какое-либо из обязательных полей не заполнено, выдаётся соответствующая ошибка.
Проверка движения пробы. check-sample-moving

Проверяет маршрут движения пробы по этапам. Получает историю перемещений записи и определяет, происходило ли движение (нахождение более чем на одном этапе). Отображает маршрут или сообщает, что движение не происходило.
Проверка прав пользователя. check-user-rights

Проверяет права доступа пользователя к определённым ресурсам (объекты анализа, методики, записи ЛЖ). Отображает таблицу с типами доступа (чтение, запись и т.д.) и наличием прав по каждому ресурсу.
Заполнение атрибутов записи ЛЖ. fill-record-fields

Автоматически заполняет заданные поля в записи журнала (например, даты, место отбора, шифр пробы и др.). Есть возможность использования ключевых слов для сопоставления полей, если точные названия не совпадают.
Деление данных. copy-journal-record

Создаёт копию записи журнала на заданном этапе маршрута. Выводит сообщение с ID новой записи.