Контроль наличия роли для администрирования, интеграция с "Сервисами обмена", удаление файлов выборок по одному, контроль возможности перехода к статусу (для файла выборки, модели)

This commit is contained in:
Mikhail Chechnev 2024-10-16 19:05:49 +03:00
parent e59247fd2d
commit d82d4646d3
6 changed files with 525 additions and 108 deletions

View File

@ -33,7 +33,7 @@ create or replace package UDO_PKG_EQUIPDS as
SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе
SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой
SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict))
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
NPRECISION_P in number, -- Точность (план)
NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования
NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных
@ -82,6 +82,21 @@ create or replace package UDO_PKG_EQUIPDS as
COUT out clob -- Сериализованная таблица данных
);
/* Удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_DEL
(
NRN in number -- Регистрационный номер
);
/* Формирование "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_MAKE
(
NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных
NDATASET_IDENT in number, -- Идентификатор буфера данных
NDATASET_CONFIG_IDENT in number, -- Идентификатор буфера описания данных
NCLEAR in number := 0 -- Флаг очистки имеющихся файлов данных (0 - не очищать, 1 - очистить)
);
/* Загрузка на сервер "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_UPLOAD
(
@ -105,7 +120,7 @@ create or replace package UDO_PKG_EQUIPDS as
procedure CMML_INS
(
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict))
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
NPRECISION_P in number, -- Точность (план)
NRN out number -- Регистрационный номер
);
@ -159,11 +174,6 @@ end UDO_PKG_EQUIPDS;
/
create or replace package body UDO_PKG_EQUIPDS as
/*
TODO: owner="root" created="06.08.2024"
text="Проверка прав доступа на работу с ""Выборками данных"""
*/
/* Список "Выборки данных оборудования" */
procedure LIST
(
@ -174,7 +184,14 @@ text="Проверка прав доступа на работу с ""Выбор
NCUR integer; -- Курсор документа для результата
XDOC PKG_XMAKE.TNODE; -- Документ для результата
XDS PKG_XMAKE.TNODE; -- Элемент для выборки данных
NACCESS PKG_STD.TNUMBER := 0; -- Флаг наличия доступа к моделям (0 - доступа нет, 1 - доступ есть)
begin
/* Проверим права доступа */
if (UDO_PKG_EQUIPDS_BASE.UTL_ACCESS_CHECK(SUSER => UTILIZER(),
STABLE => 'UDO_T_EQUIPDS',
SACTION => 'UDO_EQUIPDS_SELECT')) then
NACCESS := 1;
end if;
/* Открываем документ */
NCUR := PKG_XMAKE.OPEN_CURSOR();
/* Обходим выборки данных */
@ -183,6 +200,7 @@ text="Проверка прав доступа на работу с ""Выбор
T.NAME SNAME
from UDO_T_EQUIPDS T
where T.COMPANY = NCOMPANY
and NACCESS = 1
order by T.NAME)
loop
XDS := PKG_XMAKE.CONCAT(ICURSOR => NCUR,
@ -201,7 +219,12 @@ text="Проверка прав доступа на работу с ""Выбор
SVALUE => C.SNAME))));
end loop;
/* Формируем XML-представление ответа */
XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XDS);
XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR,
SNAME => 'XDATA',
RNODE00 => XDS,
RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR,
SNAME => 'NACCESS',
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR, NVALUE => NACCESS)));
/* Конвертируем в CLOB */
COUT := PKG_XMAKE.SERIALIZE_TO_CLOB(ICURSOR => NCUR,
ITYPE => PKG_XMAKE.CONTENT_,
@ -223,6 +246,8 @@ text="Проверка прав доступа на работу с ""Выбор
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDS', SACTION => 'UDO_EQUIPDS_INSERT');
/* Добавляем запись */
UDO_PKG_EQUIPDS_BASE.INS(NCOMPANY => NCOMPANY, SCODE => SCODE, SNAME => SNAME, NRN => NRN);
end INS;
@ -235,6 +260,8 @@ text="Проверка прав доступа на работу с ""Выбор
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDS', SACTION => 'UDO_EQUIPDS_DELETE', NDOCUMENT => NRN);
/* Удаляем запись */
UDO_PKG_EQUIPDS_BASE.DEL(NRN => NRN, NCOMPANY => NCOMPANY);
end DEL;
@ -252,7 +279,7 @@ text="Проверка прав доступа на работу с ""Выбор
SEXSSERVICEFN_SEND_MD in varchar2, -- Функция обмена для передачи внешней системе
SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой
SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict))
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
NPRECISION_P in number, -- Точность (план)
NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования
NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных
@ -261,6 +288,8 @@ text="Проверка прав доступа на работу с ""Выбор
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация
NEQUIPDSCMML PKG_STD.TREF; -- Рег. номер модели
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDS', SACTION => 'UDO_EQUIPDS_MAKE');
/* Проверим наличие такой выборки */
UDO_PKG_EQUIPDS_BASE.FIND_BY_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SEQUIPDS, NRN => NEQUIPDS);
/* Выборки нет */
@ -313,6 +342,8 @@ text="Проверка прав доступа на работу с ""Выбор
XDOC PKG_XMAKE.TNODE; -- Документ для результата
XEQUIPDSCM PKG_XMAKE.TNODE; -- Элемент для карточки
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_SELECT');
/* Открываем документ */
NCUR := PKG_XMAKE.OPEN_CURSOR();
/* Обращаемся к данным класса оборудования */
@ -388,6 +419,8 @@ text="Проверка прав доступа на работу с ""Выбор
XDOC PKG_XMAKE.TNODE; -- Документ для результата
XDSCM PKG_XMAKE.TNODE; -- Элемент для выборки данных
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_SELECT');
/* Открываем документ */
NCUR := PKG_XMAKE.OPEN_CURSOR();
/* Обходим классы оборудования заданной выборки данных */
@ -482,6 +515,8 @@ text="Проверка прав доступа на работу с ""Выбор
NEXSSERVICEFN_SEND_MD PKG_STD.TREF; -- Рег. номер Функции обмена для передачи внешней системе
NEXSSERVICEFN_SEND_RQ PKG_STD.TREF; -- Рег. номер функции обмена для обработки внешней системой
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_INSERT');
/* Разыменуем ссылки */
UDO_PKG_EQUIPDS_BASE.CM_JOINS(NCOMPANY => NCOMPANY,
SEQOBJKIND => SEQOBJKIND,
@ -517,9 +552,11 @@ text="Проверка прав доступа на работу с ""Выбор
)
is
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCM', SACTION => 'UDO_EQUIPDSCM_DELETE', NDOCUMENT => NRN);
/* Удаляем запись */
UDO_PKG_EQUIPDS_BASE.CM_DEL(NRN => NRN);
end CM_DEL;
end CM_DEL;
/* Список "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_LIST
@ -531,6 +568,8 @@ text="Проверка прав доступа на работу с ""Выбор
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_SELECT');
/* Инициализируем таблицу данных */
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
/* Добавляем в таблицу описание колонок */
@ -556,6 +595,10 @@ text="Проверка прав доступа на работу с ""Выбор
SCAPTION => 'Сообщение об ошибке',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SACTIONS',
SCAPTION => 'Действия',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
/* Обходим данные */
for C in (select T.RN NRN,
T.FILE_NAME SFILE_NAME,
@ -572,6 +615,7 @@ text="Проверка прав доступа на работу с ""Выбор
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SDESCR', SVALUE => C.SDESCR);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS');
/* Добавляем строку в таблицу */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end loop;
@ -579,40 +623,165 @@ text="Проверка прав доступа на работу с ""Выбор
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
end CMFL_LIST;
/* Загрузка на сервер "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_UPLOAD
/* Удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_DEL
(
NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных
NRN in number -- Регистрационный номер
)
is
begin
/*
TODO: owner="root" created="07.08.2024"
text="Реализовать проверку возможности выполнения действия и установки статусов"
*/
/* Выставим состояние файлам данных класса оборудования */
for C in (select T.RN NRN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM)
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_DELETE', NDOCUMENT => NRN);
/* Выполним базовое удаление */
UDO_PKG_EQUIPDS_BASE.CMFL_DEL(NRN => NRN);
end CMFL_DEL;
/* Формирование "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_MAKE
(
NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных
NDATASET_IDENT in number, -- Идентификатор буфера данных
NDATASET_CONFIG_IDENT in number, -- Идентификатор буфера описания данных
NCLEAR in number := 0 -- Флаг очистки имеющихся файлов данных (0 - не очищать, 1 - очистить)
)
is
NCMFL PKG_STD.TREF; -- Рег. номер добавленного файла данных
NFILES_CNT PKG_STD.TNUMBER := 0; -- Количество найденных файлов выборки
NCONFIG_CNT PKG_STD.TNUMBER := 0; -- Количество найденных описаний выборки
begin
/* Проверим параметры */
if (COALESCE(NDATASET_IDENT, 0) = 0) then
P_EXCEPTION(0,
'Пользовательская процедура формирования данных не вернула идентификатор буфера выборки.');
end if;
if (COALESCE(NDATASET_CONFIG_IDENT, 0) = 0) then
P_EXCEPTION(0,
'Пользовательская процедура формирования данных не вернула идентификатор буфера описания выборки.');
end if;
/* Зачистим старые файлы */
if (NCLEAR = 1) then
for C in (select T.RN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM)
loop
UDO_PKG_EQUIPDS_BASE.CMFL_DEL(NRN => C.RN);
end loop;
end if;
/* Добавим новые файлы выборки */
for C in (select F.*
from FILE_BUFFER F
where F.IDENT = NDATASET_IDENT
and F.DATA is not null
and F.BDATA is not null
and F.FILENAME is not null)
loop
UDO_PKG_EQUIPDS_BASE.CMFL_SET_STATUS(NRN => C.NRN, NSTATUS => 2, SQUEUE_ID => C.NRN, SERR => null);
NFILES_CNT := NFILES_CNT + 1;
UDO_PKG_EQUIPDS_BASE.CMFL_INS(NPRN => NEQUIPDSCM,
SFILE_NAME => C.FILENAME,
SDESCR => C.DATA,
BDATASET => C.BDATA,
NRN => NCMFL);
end loop;
/* Добавим описание выборки */
for C in (select F.*
from FILE_BUFFER F
where F.IDENT = NDATASET_CONFIG_IDENT
and F.DATA is not null)
loop
NCONFIG_CNT := NCONFIG_CNT + 1;
UDO_PKG_EQUIPDS_BASE.CM_SET_DATA_CONFIG(NRN => NEQUIPDSCM, BDATA_CONFIG => C.DATA);
end loop;
/* Проверим, что сформировали данные */
if (NFILES_CNT = 0) then
P_EXCEPTION(0,
'Пользовательская процедура формирования данных не вернула выборку.');
end if;
if (NCONFIG_CNT = 0) then
P_EXCEPTION(0,
'Пользовательская процедура формирования данных не вернула описание выборки.');
end if;
/* Зачистим буфер */
P_FILE_BUFFER_CLEAR(NIDENT => NDATASET_IDENT);
P_FILE_BUFFER_CLEAR(NIDENT => NDATASET_CONFIG_IDENT);
end CMFL_MAKE;
/* Загрузка на сервер "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_UPLOAD
(
NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
NIDENT PKG_STD.TREF; -- Идентификатор выбранных файлов
NTMP PKG_STD.TREF; -- Рег. номер записи буфера
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_UPLOAD');
/* Обходим файлы данных для загрузки */
for C in (select T.RN NRN
from UDO_T_EQUIPDSCMFL T
where T.PRN = NEQUIPDSCM
and T.STATUS in
(UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_REGISTERED, UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_UPLOAD_ERR))
loop
/* Сформируем идентификатор выборки, если ещё не делали этого */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавляем файл в выборку */
P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => C.NRN, SUNITCODE => 'UDO_T_EQUIPDSCMFL', NRN => NTMP);
end loop;
/* Проверим, что в выборку попали данные */
if (NIDENT is null) then
P_EXCEPTION(0,
'Нет данных для загрузки на сервер. Сначала необходимо выполнить формирование обучающей выборки.');
end if;
/* Устанавливаем статус - загружается на сервер */
for C in (select SL.DOCUMENT NRN
from SELECTLIST SL
where SL.IDENT = NIDENT
and SL.UNITCODE = 'UDO_T_EQUIPDSCMFL')
loop
UDO_PKG_EQUIPDS_BASE.CMFL_SET_STATUS(NRN => C.NRN, NSTATUS => UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_UPLOADING);
end loop;
/* Ставим задачу на зугрузку в очередь */
UDO_PKG_EQUIPDS_DATAPROCESS.UPLOAD(NCOMPANY => NCOMPANY, NIDENT => NIDENT, NEQUIPDSCM => NEQUIPDSCM);
/* Очищаем выборку */
P_SELECTLIST_CLEAR(NIDENT => NIDENT);
end CMFL_UPLOAD;
/* Передача внешней системе "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_SEND_MD
(
NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных
NEQUIPDSCM in number -- Рег. номер класса оборудования выборки данных
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
NIDENT PKG_STD.TREF; -- Идентификатор выбранных файлов
NTMP PKG_STD.TREF; -- Рег. номер записи буфера
begin
/*
TODO: owner="root" created="07.08.2024"
text="Реализовать проверку возможности выполнения действия и установки статусов"
*/
/* Выставим состояние файлам данных класса оборудования */
for C in (select T.RN NRN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM)
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMFL', SACTION => 'UDO_EQUIPDSCMFL_SEND_MD');
/* Обходим файлы данных для передаче внешней системе */
for C in (select T.RN NRN
from UDO_T_EQUIPDSCMFL T
where T.PRN = NEQUIPDSCM
and T.STATUS = UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_UPLOADED)
loop
UDO_PKG_EQUIPDS_BASE.CMFL_SET_STATUS(NRN => C.NRN, NSTATUS => 5, SQUEUE_ID => C.NRN, SERR => null);
/* Сформируем идентификатор выборки, если ещё не делали этого */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавляем файл в выборку */
P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => C.NRN, SUNITCODE => 'UDO_T_EQUIPDSCMFL', NRN => NTMP);
end loop;
/* Проверим, что в выборку попали данные */
if (NIDENT is null) then
P_EXCEPTION(0,
'Нет данных для передачи внешней системе. Сначала необходимо выполнить передачу данных на сервер.');
end if;
/* Ставим задачу на передачу внешней системе */
UDO_PKG_EQUIPDS_DATAPROCESS.SEND_MD(NCOMPANY => NCOMPANY, NIDENT=> NIDENT, NEQUIPDSCM => NEQUIPDSCM);
/* Очищаем выборку */
P_SELECTLIST_CLEAR(NIDENT => NIDENT);
end CMFL_SEND_MD;
/* Список "Выборки данных оборудования (классы оборудования, модели)" */
@ -625,6 +794,8 @@ text="Проверка прав доступа на работу с ""Выбор
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_SELECT');
/* Инициализируем таблицу данных */
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
/* Добавляем в таблицу описание колонок */
@ -689,12 +860,14 @@ text="Проверка прав доступа на работу с ""Выбор
procedure CMML_INS
(
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict))
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
NPRECISION_P in number, -- Точность (план)
NRN out number -- Регистрационный номер
)
is
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_INSERT');
/* Добавляем запись */
UDO_PKG_EQUIPDS_BASE.CMML_INS(NPRN => NPRN, STASK => STASK, NPRECISION_P => NPRECISION_P, NRN => NRN);
end CMML_INS;
@ -706,6 +879,8 @@ text="Проверка прав доступа на работу с ""Выбор
)
is
begin
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_DELETE', NDOCUMENT => NRN);
/* Удаляем запись */
UDO_PKG_EQUIPDS_BASE.CMML_DEL(NRN => NRN);
end CMML_DEL;
@ -713,25 +888,37 @@ text="Проверка прав доступа на работу с ""Выбор
/* Обработка внешней системой "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_SEND_RQ
(
NEQUIPDSCMML in number -- Рег. номер модели класса оборудования выборки данных
NEQUIPDSCMML in number -- Рег. номер модели класса оборудования выборки данных
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
RCMML UDO_T_EQUIPDSCMML%rowtype; -- Запись модели
NCOUNT PKG_STD.TNUMBER; -- Количество файлов данных модели, переданных внешней системе
begin
/*
TODO: owner="root" created="07.08.2024"
text="Реализовать проверку возможности выполнения действия и установки статусов"
*/
/* Обратимся к модели */
for C in (select T.RN NRN,
T.PRECISION_P NPRECISION_P
from UDO_T_EQUIPDSCMML T
where T.RN = NEQUIPDSCMML)
loop
/* Установим фактическую точность */
UDO_PKG_EQUIPDS_BASE.CMML_SET_PRECISION_F(NRN => C.NRN, NPRECISION_F => C.NPRECISION_P);
/* Установим состояние модели */
UDO_PKG_EQUIPDS_BASE.CMML_SET_STATUS(NRN => C.NRN, NSTATUS => 2, SQUEUE_ID => C.NRN, SERR => null);
end loop;
/* Считаем модель */
RCMML := UDO_PKG_EQUIPDS_BASE.CMML_GET(NFLAG_SMART => 0, NRN => NEQUIPDSCMML);
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML',
SACTION => 'UDO_EQUIPDSCMML_SEND_RQ',
NDOCUMENT => RCMML.RN);
/* Проверим, что у класса оборудования есть файлы данных, переданные внешней системе */
begin
select count(T.RN)
into NCOUNT
from UDO_T_EQUIPDSCMFL T
where T.PRN = RCMML.PRN
and T.STATUS = UDO_PKG_EQUIPDS_BASE.NCMFL_STATUS_SENT;
exception
when others then
P_EXCEPTION(0,
'Не удалось проверить состояние файлов данных выборки.');
end;
if (NCOUNT = 0) then
P_EXCEPTION(0,
'У класса оборудования нет файлов данных, переданных фреймворку - обучение невозможно.');
end if;
/* Отправим запрос на обучение */
--UDO_PKG_EQUIPDS_DATAPROCESS.SEND_RQ(NCOMPANY => NCOMPANY, NEQUIPDSCMML => RCMML.RN);
end CMML_SEND_RQ;
/* Состояние "Выборки данных оборудования (классы оборудования, модели)" по единице оборудования */
@ -752,11 +939,11 @@ text="Проверка прав доступа на работу с ""Выбор
and CM.RN = ML.PRN)
loop
/* Модель есть */
if (NRES < 2) then
if (NRES < UDO_PKG_EQUIPDS_BASE.NCMML_STATUS_PROCESSED) then
NRES := 1;
end if;
/* Если она уже обучена */
if (C.STATUS = 2) then
if (C.STATUS = UDO_PKG_EQUIPDS_BASE.NCMML_STATUS_PROCESSED) then
NRES := 2;
end if;
end loop;

View File

@ -1,5 +1,42 @@
create or replace package UDO_PKG_EQUIPDS_BASE as
/* Константы - состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
NCMFL_STATUS_REGISTERED constant PKG_STD.TNUMBER := 0; -- Зарегистрирован
NCMFL_STATUS_UPLOADING constant PKG_STD.TNUMBER := 1; -- Загружается на сервер
NCMFL_STATUS_UPLOADED constant PKG_STD.TNUMBER := 2; -- Успешно загружен на сервер
NCMFL_STATUS_UPLOAD_ERR constant PKG_STD.TNUMBER := 3; -- Ошибка загрузки на сервер
NCMFL_STATUS_SENDING constant PKG_STD.TNUMBER := 4; -- Загружается во внешнюю систему
NCMFL_STATUS_SENT constant PKG_STD.TNUMBER := 5; -- Успешно загружен во внешнюю систему
NCMFL_STATUS_SEND_ERR constant PKG_STD.TNUMBER := 6; -- При загрузке во внешнюю систему произошла ошибка
/* Константы - типовые задачи "Выборки данных оборудования (классы оборудования, модели)" */
SCMML_TASK_TCF constant PKG_STD.TSTRING := 'TCF'; -- TCF - оценка технического состояния (Technical Condition Forecast)
SCMML_TASK_RUL constant PKG_STD.TSTRING := 'RUL'; -- RUL - прогнозирование остаточного ресурса (Remaining Useful Life)
SCMML_TASK_FP constant PKG_STD.TSTRING := 'FP'; -- FP - Прогнозирование отказа (Failure Predict)
/* Константы - состояния "Выборки данных оборудования (классы оборудования, модели)" */
NCMML_STATUS_REGISTERED constant PKG_STD.TNUMBER := 0; -- Зарегистрирована
NCMML_STATUS_PROCESSING constant PKG_STD.TNUMBER := 1; -- Обрабатывается внешней системой
NCMML_STATUS_PROCESSED constant PKG_STD.TNUMBER := 2; -- Успешно обработана внешней системой
NCMML_STATUS_PROCESS_ERR constant PKG_STD.TNUMBER := 3; -- При обработке внешней системой произошла ошибка
/* Проверка прав доступа */
function UTL_ACCESS_CHECK
(
SUSER in varchar2, -- Пользователь
STABLE in varchar2, -- Таблица раздела
SACTION in varchar2, -- Действие в разделе
NDOCUMENT in number := null -- Регистрационный номер документа
) return boolean; -- Флаг доступа (false - нет доступа, true - доступ есть)
/* Проверка прав доступа (процедурная обёртка) */
procedure UTL_ACCESS
(
STABLE in varchar2, -- Таблица раздела
SACTION in varchar2, -- Действие в разделе
NDOCUMENT in number :=null -- Регистрационный номер документа
);
/* Считывание записи "Выборки данных оборудования" по регистрационному номеру */
function GET
(
@ -109,12 +146,27 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
NRN in number -- Регистрационный номер
);
/* Базовая установка описания структуры выборки "Выборки данных оборудования (классы оборудования)" */
procedure CM_SET_DATA_CONFIG
(
NRN in number, -- Регистрационный номер
BDATA_CONFIG in clob -- Описание структуры выборки
);
/* Считывание записи "Выборки данных оборудования (классы оборудования, файлы данных)" по регистрационному номеру */
function CMFL_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMFL%rowtype; -- Запись файла данных класса оборудования выборки данных
/* Базовое добавление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_INS
(
NPRN in number, -- Родитель
SFILE_NAME in varchar2, -- Имя файла
SDESCR in varchar2, -- Описание
BDATASET in blob, -- Данные выборки
NRN out number -- Регистрационный номер
);
@ -134,18 +186,25 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_SET_STATUS
(
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (0 - зарегистрирован, 1 - загружается на сервер, 2 - успешно загружен на сервер, 3 - ошибка загрузки на сервер, 4 - загружается во внешнюю систему, 5 - успешно загружен во внешнюю систему, 6 - при загрузке во внешнюю систему произошла ошибка)
SQUEUE_ID in varchar2, -- Идентификатор очереди обработки
SERR in varchar2 -- Сообщение об ошибке
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (см. константы NCMFL_STATUS_*)
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
SERR in varchar2 := null -- Сообщение об ошибке
);
/* Считывание записи "Выборки данных оборудования (классы оборудования, модели)" по регистрационному номеру */
function CMML_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMML%rowtype; -- Запись модели класса оборудования выборки данных
/* Поиск "Выборки данных оборудования (классы оборудования, модели)" по задаче */
procedure CMML_FIND_BY_TASK
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
NPRECISION_P in number, -- Точность (план)
NRN out number -- Регистрационный номер
);
@ -154,7 +213,7 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
procedure CMML_INS
(
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
NPRECISION_P in number, -- Точность (план)
NRN out number -- Регистрационный номер
);
@ -163,7 +222,7 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
procedure CMML_UPD
(
NRN in number, -- Регистрационный номер
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
NPRECISION_P in number -- Точность (план)
);
@ -183,16 +242,16 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_SET_STATUS
(
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (0 - зарегистрирована, 1 - обрабатывается внешней системой, 2 - успешно обработана внешней системой, 3 - при обработке внешней системой произошла ошибка)
SQUEUE_ID in varchar2, -- Идентификатор очереди обработки
SERR in varchar2 -- Сообщение об ошибке
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (см. константы NCMML_STATUS_*)
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
SERR in varchar2 := null -- Сообщение об ошибке
);
/* Формирование наименования для задачи "Выборки данных оборудования (классы оборудования, модели)" */
function CMML_TASK_NAME
(
STASK in varchar2 -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2 -- Задача (см. константы SCMML_TASK_*) */
) return varchar2; -- Наименование задачи
/* Формирование подсказки для задачи "Выборки данных оборудования (классы оборудования, модели)" */
@ -242,6 +301,56 @@ end UDO_PKG_EQUIPDS_BASE;
/
create or replace package body UDO_PKG_EQUIPDS_BASE as
/*Константы - мнемокод роли администратора, разрешающей обучение моделей */
SROLE_ML_ADMIN constant PKG_STD.TSTRING := 'ML_ADMIN';
/* Проверка прав доступа */
function UTL_ACCESS_CHECK
(
SUSER in varchar2, -- Пользователь
STABLE in varchar2, -- Таблица раздела
SACTION in varchar2, -- Действие в разделе
NDOCUMENT in number := null -- Регистрационный номер документа
) return boolean -- Флаг доступа (false - нет доступа, true - доступ есть)
is
begin
/* Проверим наличие роли администратора у пользователя */
for C in (select UR.RN
from USERROLES UR,
ROLES R,
USERLIST UL
where UR.ROLEID = R.RN
and UR.AUTHID = UL.AUTHID
and UL.AUTHID = SUSER
and R.ROLENAME = SROLE_ML_ADMIN)
loop
/* Роль есть */
return true;
end loop;
/* Прав доступа нет */
return false;
end UTL_ACCESS_CHECK;
/* Проверка прав доступа (процедурная обёртка) */
procedure UTL_ACCESS
(
STABLE in varchar2, -- Таблица раздела
SACTION in varchar2, -- Действие в разделе
NDOCUMENT in number :=null -- Регистрационный номер документа
)
is
begin
if (not UDO_PKG_EQUIPDS_BASE.UTL_ACCESS_CHECK(SUSER => UTILIZER(),
STABLE => STABLE,
SACTION => SACTION,
NDOCUMENT => NDOCUMENT)) then
P_EXCEPTION(0,
'У вас нет прав доступа для выполнения действия "%s" в таблице "%s".',
SACTION,
STABLE);
end if;
end UTL_ACCESS;
/* Считывание записи "Выборки данных оборудования" по регистрационному номеру */
function GET
(
@ -531,12 +640,45 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
delete from UDO_T_EQUIPDSCM T where T.RN = NRN;
end CM_DEL;
/* Базовая установка описания структуры выборки "Выборки данных оборудования (классы оборудования)" */
procedure CM_SET_DATA_CONFIG
(
NRN in number, -- Регистрационный номер
BDATA_CONFIG in clob -- Описание структуры выборки
)
is
begin
/* Установим описание структуры выборки */
update UDO_T_EQUIPDSCM T set T.DATA_CONFIG = BDATA_CONFIG where T.RN = NRN;
end CM_SET_DATA_CONFIG;
/* Считывание записи "Выборки данных оборудования (классы оборудования, файлы данных)" по регистрационному номеру */
function CMFL_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMFL%rowtype -- Запись файла данных класса оборудования выборки данных
is
RES UDO_T_EQUIPDSCMFL%rowtype; -- Буфер для результата
begin
/* Считывание записи */
begin
select T.* into RES from UDO_T_EQUIPDSCMFL T where T.RN = NRN;
exception
when NO_DATA_FOUND then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDSCMFL');
end;
/* Возврат результата */
return RES;
end CMFL_GET;
/* Базовое добавление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_INS
(
NPRN in number, -- Родитель
SFILE_NAME in varchar2, -- Имя файла
SDESCR in varchar2, -- Описание
BDATASET in blob, -- Данные выборки
NRN out number -- Регистрационный номер
)
is
@ -545,21 +687,29 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
NRN := GEN_ID();
/* Добавляем запись */
insert into UDO_T_EQUIPDSCMFL
(RN, PRN, FILE_NAME, DESCR, QUEUE_ID, STATUS, ERR)
(RN, PRN, FILE_NAME, DESCR, QUEUE_ID, STATUS, ERR, DATASET)
values
(NRN, NPRN, SFILE_NAME, SDESCR, null, 0, null);
(NRN, NPRN, SFILE_NAME, SDESCR, null, NCMFL_STATUS_REGISTERED, null, BDATASET);
end CMFL_INS;
/* Базовое удаление "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_DEL
(
NRN in number -- Регистрационный номер
NRN in number -- Регистрационный номер
)
is
RREC UDO_T_EQUIPDSCMFL%rowtype; -- Обрабатываемая запись
begin
/* Считаем запись */
RREC := CMFL_GET(NFLAG_SMART => 0, NRN => NRN);
/* Можно удалять только в статусах: зарегистрирован, успешно загружен на сервер, ошибка загрузки на сервер, успешно загружен во внешнюю систему, при загрузке во внешнюю систему произошла ошибка */
if (RREC.STATUS not in
(NCMFL_STATUS_REGISTERED, NCMFL_STATUS_UPLOADED, NCMFL_STATUS_UPLOAD_ERR, NCMFL_STATUS_SENT, NCMFL_STATUS_SEND_ERR)) then
P_EXCEPTION(0, 'Файл данных обрабатывается, удаление невозможно.');
end if;
/* Удалим запись */
delete from UDO_T_EQUIPDSCMFL T where T.RN = NRN;
end CMFL_DEL;
end CMFL_DEL;
/* Базовая установка имени файла "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_SET_FILE_NAME
@ -576,27 +726,66 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, файлы данных)" */
procedure CMFL_SET_STATUS
(
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (0 - зарегистрирован, 1 - загружается на сервер, 2 - успешно загружен на сервер, 3 - ошибка загрузки на сервер, 4 - загружается во внешнюю систему, 5 - успешно загружен во внешнюю систему, 6 - при загрузке во внешнюю систему произошла ошибка)
SQUEUE_ID in varchar2, -- Идентификатор очереди обработки
SERR in varchar2 -- Сообщение об ошибке
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (см. константы NCMFL_STATUS_*)
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
SERR in varchar2 := null -- Сообщение об ошибке
)
is
SQUEUE_ID_ PKG_STD.TSTRING := SQUEUE_ID; -- Буфер для идентификатора очереди обработки
SERR_ PKG_STD.TSTRING := SERR; -- Буфер для сообщения об ошибке
begin
/* Проверим идентификатор очереди */
if ((NSTATUS in (NCMFL_STATUS_SENDING, NCMFL_STATUS_SENT)) and (SQUEUE_ID_ is null)) then
P_EXCEPTION(0,
'Идентификатор очереди обработки обязателен для перевода файла данных в состояния "Загружается во внешнюю систему", "Успешно загружен во внешнюю систему".');
end if;
/* Проверим сообщение об ошибке */
if ((NSTATUS in (NCMFL_STATUS_UPLOAD_ERR, NCMFL_STATUS_SEND_ERR)) and (SERR_ is null)) then
P_EXCEPTION(0,
'Текст сообщения об ошибке обязателен для перевода файла данных в состояния "Ошибка загрузки на сервер", "Ошибка загрузки во внешнюю систему".');
end if;
/* Удалим идентификатор очереди обработки и сообщение об ошибке для тех статусов, где они не нужны */
if (NSTATUS not in (NCMFL_STATUS_SENDING, NCMFL_STATUS_SENT)) then
SQUEUE_ID_ := null;
end if;
if (NSTATUS not in (NCMFL_STATUS_UPLOAD_ERR, NCMFL_STATUS_SEND_ERR)) then
SERR_ := null;
end if;
/* Установим состояние и сопутствующие ему атрибуты */
update UDO_T_EQUIPDSCMFL T
set T.STATUS = NSTATUS,
T.QUEUE_ID = SQUEUE_ID,
T.ERR = SERR
T.QUEUE_ID = SQUEUE_ID_,
T.ERR = SERR_
where T.RN = NRN;
end CMFL_SET_STATUS;
/* Считывание записи "Выборки данных оборудования (классы оборудования, модели)" по регистрационному номеру */
function CMML_GET
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NRN in number -- Регистрационный номер
) return UDO_T_EQUIPDSCMML%rowtype -- Запись модели класса оборудования выборки данных
is
RES UDO_T_EQUIPDSCMML%rowtype; -- Буфер для результата
begin
/* Считывание записи */
begin
select T.* into RES from UDO_T_EQUIPDSCMML T where T.RN = NRN;
exception
when NO_DATA_FOUND then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => NFLAG_SMART, NDOCUMENT => NRN, SUNIT_TABLE => 'UDO_T_EQUIPDSCMML');
end;
/* Возврат результата */
return RES;
end CMML_GET;
/* Поиск "Выборки данных оборудования (классы оборудования, модели)" по задаче */
procedure CMML_FIND_BY_TASK
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
NPRECISION_P in number, -- Точность (план)
NRN out number -- Регистрационный номер
)
@ -624,7 +813,7 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
procedure CMML_INS
(
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
NPRECISION_P in number, -- Точность (план)
NRN out number -- Регистрационный номер
)
@ -636,18 +825,26 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
insert into UDO_T_EQUIPDSCMML
(RN, PRN, TASK, PRECISION_P, PRECISION_F, QUEUE_ID, STATUS, ERR)
values
(NRN, NPRN, STASK, NPRECISION_P, null, null, 0, null);
(NRN, NPRN, STASK, NPRECISION_P, null, null, NCMML_STATUS_REGISTERED, null);
end CMML_INS;
/* Базовое исправление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_UPD
(
NRN in number, -- Регистрационный номер
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
NPRECISION_P in number -- Точность (план)
NRN in number, -- Регистрационный номер
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*) */
NPRECISION_P in number -- Точность (план)
)
is
RREC UDO_T_EQUIPDSCMML%rowtype; -- Обрабатываемая запись
begin
/* Считаем запись */
RREC := CMML_GET(NFLAG_SMART => 0, NRN => NRN);
/* Можно изменять только в статусах: зарегистрирована, при обработке внешней системой произошла ошибка */
if (RREC.STATUS not in (NCMML_STATUS_REGISTERED, NCMML_STATUS_PROCESS_ERR)) then
P_EXCEPTION(0,
'Модель обрабатывается или уже успешно обработана, изменение невозможно.');
end if;
/* Исправим данные */
update UDO_T_EQUIPDSCMML T
set T.TASK = STASK,
@ -658,10 +855,17 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
/* Базовое удаление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_DEL
(
NRN in number -- Регистрационный номер
NRN in number -- Регистрационный номер
)
is
RREC UDO_T_EQUIPDSCMML%rowtype; -- Обрабатываемая запись
begin
/* Считаем запись */
RREC := CMML_GET(NFLAG_SMART => 0, NRN => NRN);
/* Можно удалять только в статусах: зарегистрирована, успешно обработана внешней системой, при обработке внешней системой произошла ошибка */
if (RREC.STATUS not in (NCMML_STATUS_REGISTERED, NCMML_STATUS_PROCESSED, NCMML_STATUS_PROCESS_ERR)) then
P_EXCEPTION(0, 'Модель обрабатывается, удаление невозможно.');
end if;
/* Удалим историю */
for C in (select T.RN from UDO_T_EQUIPDSCMMLH T where T.PRN = NRN)
loop
@ -686,34 +890,53 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
/* Базовая установка состояния "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_SET_STATUS
(
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (0 - зарегистрирована, 1 - обрабатывается внешней системой, 2 - успешно обработана внешней системой, 3 - при обработке внешней системой произошла ошибка)
SQUEUE_ID in varchar2, -- Идентификатор очереди обработки
SERR in varchar2 -- Сообщение об ошибке
NRN in number, -- Регистрационный номер
NSTATUS in number, -- Состояние (см. константы NCMML_STATUS_*)
SQUEUE_ID in varchar2 := null, -- Идентификатор очереди обработки
SERR in varchar2 := null -- Сообщение об ошибке
)
is
SQUEUE_ID_ PKG_STD.TSTRING := SQUEUE_ID; -- Буфер для идентификатора очереди обработки
SERR_ PKG_STD.TSTRING := SERR; -- Буфер для сообщения об ошибке
begin
/* Проверим идентификатор очереди */
if ((NSTATUS in (NCMML_STATUS_PROCESSING, NCMML_STATUS_PROCESSED)) and (SQUEUE_ID_ is null)) then
P_EXCEPTION(0,
'Идентификатор очереди обработки обязателен для перевода модели в состояния "Обрабатывается внешней системой", "Успешно обработана внешней системой".');
end if;
/* Проверим сообщение об ошибке */
if ((NSTATUS in (NCMML_STATUS_PROCESS_ERR)) and (SERR_ is null)) then
P_EXCEPTION(0,
'Текст сообщения об ошибке обязателен для перевода модели в состояние "Ошибка обработки внешней системой".');
end if;
/* Удалим идентификатор очереди обработки и сообщение об ошибке для тех статусов, где они не нужны */
if (NSTATUS not in (NCMML_STATUS_PROCESSING, NCMML_STATUS_PROCESSED)) then
SQUEUE_ID_ := null;
end if;
if (NSTATUS not in (NCMML_STATUS_PROCESS_ERR)) then
SERR_ := null;
end if;
/* Установим состояние и сопутствующие ему атрибуты */
update UDO_T_EQUIPDSCMML T
set T.STATUS = NSTATUS,
T.QUEUE_ID = SQUEUE_ID,
T.ERR = SERR
T.QUEUE_ID = SQUEUE_ID_,
T.ERR = SERR_
where T.RN = NRN;
end CMML_SET_STATUS;
/* Формирование наименования для задачи "Выборки данных оборудования (классы оборудования, модели)" */
function CMML_TASK_NAME
(
STASK in varchar2 -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2 -- Задача (см. константы SCMML_TASK_*) */
) return varchar2 -- Наименование задачи
is
begin
case STASK
when 'TCF' then
when SCMML_TASK_TCF then
return 'Оценка технического состояния';
when 'RUL' then
when SCMML_TASK_RUL then
return 'Прогноз остаточного ресурса';
when 'FP' then
when SCMML_TASK_FP then
return 'Прогноз отказа';
else
return 'Вид задачи оценки не поддерживается';
@ -725,9 +948,9 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
return varchar2 -- Подсказка для задачи
is
begin
return '<b>TCF</b> - ' || CMML_TASK_NAME(STASK => 'TCF') || ' (<b>T</b>echnical <b>C</b>ondition <b>F</b>orecast)<br>' ||
'<b>RUL</b> - ' || CMML_TASK_NAME(STASK => 'RUL') || ' (<b>R</b>emaining <b>U</b>seful <b>L</b>ife)<br>' ||
'<b>FP</b> - ' || CMML_TASK_NAME(STASK => 'FP') || ' (<b>F</b>ailure <b>P</b>redict)';
return '<b>TCF</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_TCF) || ' (<b>T</b>echnical <b>C</b>ondition <b>F</b>orecast)<br>' ||
'<b>RUL</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_RUL) || ' (<b>R</b>emaining <b>U</b>seful <b>L</b>ife)<br>' ||
'<b>FP</b> - ' || CMML_TASK_NAME(STASK => SCMML_TASK_FP) || ' (<b>F</b>ailure <b>P</b>redict)';
end CMML_TASK_HINT;
/* Вычисление вероятности выхода из строя на дату по RUL-прогнозу */

View File

@ -82,7 +82,7 @@ create or replace package UDO_PKG_EQUIPTCF as
DFORECAST_DATE in date, -- Дата получения прогноза
NFORECAST in number, -- Прогнозное значение, полученное от фреймворка
SDICMUNTS in varchar2, -- Единица измерения выборки
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.CMML_TASK_*) */
COUT out clob -- Данные детальной карточки прогноза
);
@ -785,7 +785,7 @@ text="Проверка прав доступа при формировании
DFORECAST_DATE in date, -- Дата получения прогноза
NFORECAST in number, -- Прогнозное значение, полученное от фреймворка
SDICMUNTS in varchar2, -- Единица измерения выборки
STASK in varchar2, -- Задача (TCF - оценка технического состояния (Technical Condition Forecast), RUL - прогнозирование остаточного ресурса (Remaining Useful Life), FP - Прогнозирование отказа (Failure Predict)) */
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.CMML_TASK_*) */
COUT out clob -- Данные детальной карточки прогноза
)
is
@ -977,7 +977,7 @@ text="Проверка прав доступа при формировании
UDO_T_EQUIPDSCMML CMML
where T.EQCONFIG = NEQCONFIG
and T.PRN = CMML.RN
and CMML.TASK = 'RUL'
and CMML.TASK = UDO_PKG_EQUIPDS_BASE.SCMML_TASK_RUL
order by T.RQ_DATE desc)
loop
DFORECAST_DATE := C.DFORECAST_DATE;

View File

@ -2,23 +2,28 @@ create or replace procedure UDO_P_EQUIPDSCMFL_CREATE
/* Тестовая процедура формирования данных выборки */
(
NEQUIPDSCM in number, -- Рег. номер класса оборудования выборки данных
NCNT in number -- Количество формируемых файлов
NCNT in number, -- Количество формируемых файлов
NDATASET_IDENT out number, -- Идентификатор буфера данных
NDATASET_CONFIG_IDENT out number -- Идентификатор буфера описания данных
)
is
NTMP PKG_STD.TREF; -- Рег. номер добавленного файла данных
begin
/* Зачистим старые файлы */
for C in (select T.RN from UDO_T_EQUIPDSCMFL T where T.PRN = NEQUIPDSCM)
loop
UDO_PKG_EQUIPDS_BASE.CMFL_DEL(NRN => C.RN);
end loop;
/* Добавим новые файлы */
/* Сформируем идентификаторы */
NDATASET_IDENT := GEN_IDENT();
NDATASET_CONFIG_IDENT := GEN_IDENT();
/* Добавим новые файлы данных */
for I in 1 .. NCNT
loop
UDO_PKG_EQUIPDS_BASE.CMFL_INS(NPRN => NEQUIPDSCM,
SFILE_NAME => 'data_' || NEQUIPDSCM || '_' || I || '.xml',
SDESCR => 'Описание для файла №' || I,
NRN => NTMP);
P_FILE_BUFFER_INSERT(NIDENT => NDATASET_IDENT,
CFILENAME => 'data_' || NEQUIPDSCM || '_' || I || '_' || TO_CHAR(sysdate, 'yyyymmddhh24miss') ||
'.xml',
CDATA => 'Описание для файла №' || I,
BLOBDATA => CLOB2BLOB(LCDATA => 'Содержимое для файла №' || I));
end loop;
/* Добавим описание файлов данных */
P_FILE_BUFFER_INSERT(NIDENT => NDATASET_CONFIG_IDENT,
CFILENAME => null,
CDATA => 'Описание структуры выборки',
BLOBDATA => null);
end;
/

View File

@ -15,16 +15,18 @@ create table UDO_T_EQUIPDSCMFL
STATUS number(1) default 0 not null,
/* Сообщение об ошибке */
ERR varchar2(4000) default null,
/* Данные */
DATASET blob,
/* Ключи */
constraint UDO_C_EQUIPDSCMFL_RN_PK primary key (RN),
constraint UDO_C_EQUIPDSCMFL_PRN_FK foreign key (PRN) references UDO_T_EQUIPDSCM(RN),
constraint UDO_C_EQUIPDSCMFL_FLNM_NB check (rtrim(FILE_NAME) is not null),
constraint UDO_C_EQUIPDSCMFL_DESCR_NB check ((DESCR is null) or (rtrim(DESCR) is not null)),
constraint UDO_C_EQUIPDSCMFL_QID_NB check ((QUEUE_ID is null) or (rtrim(QUEUE_ID) is not null)),
constraint UDO_C_EQUIPDSCMFL_QID_CH check (((STATUS in (4, 5, 6)) and (QUEUE_ID is not null)) or (STATUS not in (4, 5, 6))),
constraint UDO_C_EQUIPDSCMFL_QID_CH check (((STATUS in (4, 5)) and (QUEUE_ID is not null)) or ((STATUS not in (4, 5)) and (QUEUE_ID is null))),
constraint UDO_C_EQUIPDSCMFL_STATUS_CH check (STATUS in (0, 1, 2, 3, 4, 5, 6)),
constraint UDO_C_EQUIPDSCMFL_ERR_NB check ((ERR is null) or (rtrim(ERR) is not null)),
constraint UDO_C_EQUIPDSCMFL_ERR_CH check (((STATUS in (3, 6)) and (ERR is not null)) or (STATUS not in (3, 6))),
constraint UDO_C_EQUIPDSCMFL_ERR_CH check (((STATUS in (3, 6)) and (ERR is not null)) or ((STATUS not in (3, 6)) and (ERR is null))),
constraint UDO_C_EQUIPDSCMFL_FLNM_UN unique (PRN, FILE_NAME),
constraint UDO_C_EQUIPDSCMFL_QID_UN unique (FILE_NAME, QUEUE_ID)
);

View File

@ -25,10 +25,10 @@ create table UDO_T_EQUIPDSCMML
constraint UDO_C_EQUIPDSCMML_PRECP_CH check ((PRECISION_P > 0) and (PRECISION_P <= 100)),
constraint UDO_C_EQUIPDSCMML_PRECF_CH check ((PRECISION_F is null) or ((PRECISION_F is not null) and (PRECISION_F > 0) and (PRECISION_F <= 100))),
constraint UDO_C_EQUIPDSCMML_QID_NB check ((QUEUE_ID is null) or (rtrim(QUEUE_ID) is not null)),
constraint UDO_C_EQUIPDSCMML_QID_CH check (((STATUS in (1, 2, 3)) and (QUEUE_ID is not null)) or (STATUS not in (1, 2, 3))),
constraint UDO_C_EQUIPDSCMML_QID_CH check (((STATUS in (1, 2)) and (QUEUE_ID is not null)) or ((STATUS not in (1, 2)) and (QUEUE_ID is null))),
constraint UDO_C_EQUIPDSCMML_STATUS_CH check (STATUS in (0, 1, 2, 3)),
constraint UDO_C_EQUIPDSCMML_ERR_NB check ((ERR is null) or (rtrim(ERR) is not null)),
constraint UDO_C_EQUIPDSCMML_ERR_CH check (((STATUS in (3)) and (ERR is not null)) or (STATUS not in (3))),
constraint UDO_C_EQUIPDSCMML_ERR_CH check (((STATUS in (3)) and (ERR is not null)) or ((STATUS not in (3)) and (ERR is null))),
constraint UDO_C_EQUIPDSCMML_UN unique (PRN, TASK, PRECISION_P),
constraint UDO_C_EQUIPDSCMML_QID_UN unique (QUEUE_ID)
);