diff --git a/db/UDO_PKG_EQUIPDS.pck b/db/UDO_PKG_EQUIPDS.pck
index 6074d57..1a0fad9 100644
--- a/db/UDO_PKG_EQUIPDS.pck
+++ b/db/UDO_PKG_EQUIPDS.pck
@@ -156,6 +156,7 @@ create or replace package UDO_PKG_EQUIPDS as
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
NDATASET_ID in number, -- Идентификатор выборки
+ SUSERPROCS_FRCST_DATA in varchar2, -- Пользовательская процедура формирования данных для прогноза
NRN out number -- Регистрационный номер
);
@@ -373,7 +374,7 @@ create or replace package body UDO_PKG_EQUIPDS as
else
/* Выборка есть - надо проверить в ней наличие класса оборудования */
UDO_PKG_EQUIPDS_BASE.CM_FIND_BY_EQOBJKIND(NFLAG_SMART => 1,
- NPRN => NEQUIPDS,
+ NCOMPANY => NCOMPANY,
SEQOBJKIND => SEQOBJKIND,
NRN => NEQUIPDSCM);
end if;
@@ -1151,6 +1152,11 @@ create or replace package body UDO_PKG_EQUIPDS as
SNAME => 'SDATASET',
SCAPTION => 'Выборка',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
+ PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SUSERPROCS_FRCST_DATA',
+ SCAPTION => 'Процедура формирования',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ SHINT => UDO_PKG_EQUIPDS_BASE.CMML_USERPROCS_FRCST_DATA_HINT());
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NSTATUS',
SCAPTION => 'Состояние',
@@ -1174,14 +1180,17 @@ create or replace package body UDO_PKG_EQUIPDS as
from UDO_T_EQUIPDSCMFL F
where F.DATASET_ID = T.DATASET_ID
and ROWNUM <= 1) DDATASET_TS,
+ UP.CODE SUSERPROCS_FRCST_DATA,
T.STATUS NSTATUS,
T.ERR SERR
from UDO_T_EQUIPDSCMML T,
UDO_T_EQUIPDSCM CM,
- DICMUNTS DM
+ DICMUNTS DM,
+ USERPROCS UP
where CM.RN = NEQUIPDSCM
and T.PRN = CM.RN
and CM.DICMUNTS = DM.RN
+ and T.USERPROCS_FRCST_DATA = UP.RN
order by T.RN)
loop
/* Добавляем колонки с данными */
@@ -1193,6 +1202,9 @@ create or replace package body UDO_PKG_EQUIPDS as
SNAME => 'SDATASET',
SVALUE => UDO_PKG_EQUIPDS_BASE.UTL_DATASET_MAKE_NAME(NDATASET_ID => C.NDATASET_ID,
DDATASET_TS => C.DDATASET_TS));
+ PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
+ SNAME => 'SUSERPROCS_FRCST_DATA',
+ SVALUE => C.SUSERPROCS_FRCST_DATA);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS');
@@ -1206,12 +1218,14 @@ create or replace package body UDO_PKG_EQUIPDS as
/* Клиентское добавление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_INS
(
- NPRN in number, -- Родитель
- STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
- NDATASET_ID in number, -- Идентификатор выборки
- NRN out number -- Регистрационный номер
+ NPRN in number, -- Родитель
+ STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.SCMML_TASK_*)
+ NDATASET_ID in number, -- Идентификатор выборки
+ SUSERPROCS_FRCST_DATA in varchar2, -- Пользовательская процедура формирования данных для прогноза
+ NRN out number -- Регистрационный номер
)
is
+ NUSERPROCS_FRCST_DATA PKG_STD.TREF; -- Рег. номер пользовательской процедуры формирования данных для прогноза
begin
/* Проверим параметры */
if (STASK is null) then
@@ -1220,13 +1234,21 @@ create or replace package body UDO_PKG_EQUIPDS as
if (NDATASET_ID is null) then
P_EXCEPTION(0, 'Не указана выборка.');
end if;
+ if (SUSERPROCS_FRCST_DATA is null) then
+ P_EXCEPTION(0,
+ 'Не указана процедура формирования данных для прогноза.');
+ end if;
/* Проверим права доступа */
UDO_PKG_EQUIPDS_BASE.UTL_ACCESS(STABLE => 'UDO_T_EQUIPDSCMML', SACTION => 'UDO_EQUIPDSCMML_INSERT');
+ /* Разыменуем ссылки */
+ UDO_PKG_EQUIPDS_BASE.CMML_JOINS(SUSERPROCS_FRCST_DATA => SUSERPROCS_FRCST_DATA,
+ NUSERPROCS_FRCST_DATA => NUSERPROCS_FRCST_DATA);
/* Добавляем запись */
- UDO_PKG_EQUIPDS_BASE.CMML_INS(NPRN => NPRN,
- STASK => STASK,
- NDATASET_ID => NDATASET_ID,
- NRN => NRN);
+ UDO_PKG_EQUIPDS_BASE.CMML_INS(NPRN => NPRN,
+ STASK => STASK,
+ NDATASET_ID => NDATASET_ID,
+ NUSERPROCS_FRCST_DATA => NUSERPROCS_FRCST_DATA,
+ NRN => NRN);
end CMML_INS;
/* Клиентское удаление "Выборки данных оборудования (классы оборудования, модели)" */
@@ -1356,6 +1378,11 @@ create or replace package body UDO_PKG_EQUIPDS as
SCAPTION => 'Единица измерения',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SUSERPROCS_FRCST_DATA',
+ SCAPTION => 'Процедура формирования',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ SHINT => UDO_PKG_EQUIPDS_BASE.CMML_USERPROCS_FRCST_DATA_HINT());
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NSTATUS',
SCAPTION => 'Состояние',
@@ -1375,6 +1402,7 @@ create or replace package body UDO_PKG_EQUIPDS as
T.PRN NEQUIPDSCM,
DS.NAME SNEQUIPDS,
T.TASK STASK,
+ UP.CODE SUSERPROCS_FRCST_DATA,
T.PRECISION NPRECISION,
DM.MEAS_MNEMO SDICMUNTS,
T.STATUS NSTATUS,
@@ -1382,11 +1410,13 @@ create or replace package body UDO_PKG_EQUIPDS as
from UDO_T_EQUIPDSCMML T,
UDO_T_EQUIPDSCM CM,
UDO_T_EQUIPDS DS,
- DICMUNTS DM
+ DICMUNTS DM,
+ USERPROCS UP
where T.PRN = CM.RN
and CM.PRN = DS.RN
and CM.DICMUNTS = DM.RN
and CM.EQOBJKIND = (select CF.OBJ_KIND from EQCONFIG CF where CF.RN = NEQCONFIG)
+ and T.USERPROCS_FRCST_DATA = UP.RN
order by T.RN)
loop
/* Добавляем колонки с данными */
@@ -1397,6 +1427,7 @@ create or replace package body UDO_PKG_EQUIPDS as
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STASK', SVALUE => C.STASK);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRECISION', NVALUE => C.NPRECISION);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SDICMUNTS', SVALUE => C.SDICMUNTS);
+ PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SUSERPROCS_FRCST_DATA', SVALUE => C.SUSERPROCS_FRCST_DATA);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATUS', NVALUE => C.NSTATUS);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SERR', SVALUE => C.SERR);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SACTIONS');
diff --git a/db/UDO_PKG_EQUIPDS_BASE.pck b/db/UDO_PKG_EQUIPDS_BASE.pck
index bf0cfd2..86aa50e 100644
--- a/db/UDO_PKG_EQUIPDS_BASE.pck
+++ b/db/UDO_PKG_EQUIPDS_BASE.pck
@@ -96,8 +96,8 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
procedure CM_FIND_BY_EQOBJKIND
(
NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
- NPRN in number, -- Родитель
- SEQOBJKIND in varchar2, -- Класс оборудования
+ NCOMPANY in number, -- Организация
+ SEQOBJKIND in varchar2, -- Класс оборудования (полный иерархический код)
NRN out number -- Регистрационный номер
);
@@ -227,20 +227,29 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
NRN out number -- Регистрационный номер
);
+ /* Разыменование словарей "Выборки данных оборудования (классы оборудования, модели)" */
+ procedure CMML_JOINS
+ (
+ SUSERPROCS_FRCST_DATA in varchar2, -- Пользовательская процедура формирования данных для прогноза
+ NUSERPROCS_FRCST_DATA out number -- Рег. номер пользовательской процедуры формирования данных для прогноза
+ );
+
/* Базовое добавление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_INS
(
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
NDATASET_ID in number, -- Идентификатор выборки
+ NUSERPROCS_FRCST_DATA in number, -- Рег. номер пользовательской процедуры формирования данных для прогноза
NRN out number -- Регистрационный номер
);
/* Базовое исправление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_UPD
(
- NRN in number, -- Регистрационный номер
- STASK in varchar2 -- Задача (см. константы SCMML_TASK_*)
+ NRN in number, -- Регистрационный номер
+ STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
+ NUSERPROCS_FRCST_DATA in number -- Рег. номер пользовательской процедуры формирования данных для прогноза
);
/* Базовое удаление "Выборки данных оборудования (классы оборудования, модели)" */
@@ -275,6 +284,10 @@ create or replace package UDO_PKG_EQUIPDS_BASE as
function CMML_TASK_HINT
return varchar2; -- Подсказка для задачи
+ /* Формирование подсказки для процедуры формирования данных для прогноза "Выборки данных оборудования (классы оборудования, модели)" */
+ function CMML_USERPROCS_FRCST_DATA_HINT
+ return varchar2; -- Подсказка для процедуры формирования данных для прогноза
+
/* Вычисление вероятности выхода из строя на дату по RUL-прогнозу */
function CMML_RUL_BREAKDOWN_PROB
(
@@ -495,28 +508,28 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
/* Поиск "Выборки данных оборудования (классы оборудования)" по классу оборудования */
procedure CM_FIND_BY_EQOBJKIND
(
- NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
- NPRN in number, -- Родитель
- SEQOBJKIND in varchar2, -- Класс оборудования
- NRN out number -- Регистрационный номер
+ NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать)
+ NCOMPANY in number, -- Организация
+ SEQOBJKIND in varchar2, -- Класс оборудования (полный иерархический код)
+ NRN out number -- Регистрационный номер
)
is
+ NEQOBJKIND PKG_STD.TREF; -- Рег. номер класса оборудования
begin
+ /* Класс оборудования */
+ FIND_EQOBJKIND_FULLCODE(NFLAG_SMART => NFLAG_SMART,
+ NFLAG_OPTION => 0,
+ NCOMPANY => NCOMPANY,
+ SCODE => SEQOBJKIND,
+ NRN => NEQOBJKIND);
/* Поиск записи */
begin
- select T.RN
- into NRN
- from UDO_T_EQUIPDSCM T,
- EQOBJKIND OK
- where T.PRN = NPRN
- and T.EQOBJKIND = OK.RN
- and OK.CODE = SEQOBJKIND;
+ select T.RN into NRN from UDO_T_EQUIPDSCM T where T.EQOBJKIND = NEQOBJKIND;
exception
when NO_DATA_FOUND then
P_EXCEPTION(NFLAG_SMART,
- 'Класс оборудования "%s" в выборке данных "%s" не определён.',
- SEQOBJKIND,
- TO_CHAR(NPRN));
+ 'Класс оборудования "%s" в выборках данных не определён.',
+ SEQOBJKIND);
end;
end CM_FIND_BY_EQOBJKIND;
@@ -1012,12 +1025,30 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
end;
end CMML_FIND_BY_TASK;
+ /* Разыменование словарей "Выборки данных оборудования (классы оборудования, модели)" */
+ procedure CMML_JOINS
+ (
+ SUSERPROCS_FRCST_DATA in varchar2, -- Пользовательская процедура формирования данных для прогноза
+ NUSERPROCS_FRCST_DATA out number -- Рег. номер пользовательской процедуры формирования данных для прогноза
+ )
+ is
+ begin
+ /* Процедура формирования данных для прогноза */
+ if (SUSERPROCS_FRCST_DATA is not null) then
+ FIND_USERPROCS_CODE(NFLAG_SMART => 0, SCODE => SUSERPROCS_FRCST_DATA, NRN => NUSERPROCS_FRCST_DATA);
+ else
+ P_EXCEPTION(0,
+ 'Не указана процедура формирования данных для прогноза.');
+ end if;
+ end CMML_JOINS;
+
/* Базовое добавление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_INS
(
NPRN in number, -- Родитель
STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
NDATASET_ID in number, -- Идентификатор выборки
+ NUSERPROCS_FRCST_DATA in number, -- Рег. номер пользовательской процедуры формирования данных для прогноза
NRN out number -- Регистрационный номер
)
is
@@ -1044,16 +1075,17 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
NRN := GEN_ID();
/* Добавляем запись */
insert into UDO_T_EQUIPDSCMML
- (RN, PRN, TASK, PRECISION, QUEUE_ID, STATUS, ERR, DATASET_ID)
+ (RN, PRN, TASK, PRECISION, QUEUE_ID, STATUS, ERR, DATASET_ID, USERPROCS_FRCST_DATA)
values
- (NRN, NPRN, STASK, null, null, NCMML_STATUS_REGISTERED, null, NDATASET_ID);
+ (NRN, NPRN, STASK, null, null, NCMML_STATUS_REGISTERED, null, NDATASET_ID, NUSERPROCS_FRCST_DATA);
end CMML_INS;
/* Базовое исправление "Выборки данных оборудования (классы оборудования, модели)" */
procedure CMML_UPD
(
NRN in number, -- Регистрационный номер
- STASK in varchar2 -- Задача (см. константы SCMML_TASK_*)
+ STASK in varchar2, -- Задача (см. константы SCMML_TASK_*)
+ NUSERPROCS_FRCST_DATA in number -- Рег. номер пользовательской процедуры формирования данных для прогноза
)
is
RREC UDO_T_EQUIPDSCMML%rowtype; -- Обрабатываемая запись
@@ -1066,7 +1098,10 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
'Модель обрабатывается или уже успешно обработана, изменение невозможно.');
end if;
/* Исправим данные */
- update UDO_T_EQUIPDSCMML T set T.TASK = STASK where T.RN = NRN;
+ update UDO_T_EQUIPDSCMML T
+ set T.TASK = STASK,
+ T.USERPROCS_FRCST_DATA = NUSERPROCS_FRCST_DATA
+ where T.RN = NRN;
end CMML_UPD;
/* Базовое удаление "Выборки данных оборудования (классы оборудования, модели)" */
@@ -1170,6 +1205,16 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
'FP - ' || CMML_TASK_NAME(STASK => SCMML_TASK_FP) || ' (Failure Predict)';
end CMML_TASK_HINT;
+ /* Формирование подсказки для процедуры формирования данных для прогноза "Выборки данных оборудования (классы оборудования, модели)" */
+ function CMML_USERPROCS_FRCST_DATA_HINT
+ return varchar2 -- Подсказка для процедуры формирования данных для прогноза
+ is
+ begin
+ return 'Пользовательская процедура формирования данных для прогноза. Будет вызвана при запросе прогоза у модели.
' ||
+ 'Должна иметь входной параметр "NEQCONFIG" - в него при вызове будет передан рег. номер единицы оборудования.
' ||
+ 'Должна возвращать выходные параметры "NDATASET_IDENT" и "NDATASET_CONFIG_IDENT" - идентификаторы файлового буфера с подготовленными данными (CSV) и описанием структуры данных, соответственно.';
+ end CMML_USERPROCS_FRCST_DATA_HINT;
+
/* Вычисление вероятности выхода из строя на дату по RUL-прогнозу */
function CMML_RUL_BREAKDOWN_PROB
(
diff --git a/db/UDO_T_EQUIPDSCM.sql b/db/UDO_T_EQUIPDSCM.sql
index 1639d2b..866ab76 100644
--- a/db/UDO_T_EQUIPDSCM.sql
+++ b/db/UDO_T_EQUIPDSCM.sql
@@ -34,5 +34,5 @@ create table UDO_T_EQUIPDSCM
constraint UDO_C_EQUIPDSCM_EXSFNSDMDCB_FK foreign key (EXSSERVICEFN_SEND_MDCB) references EXSSERVICEFN(RN),
constraint UDO_C_EQUIPDSCM_EXSFNSDRQ_FK foreign key (EXSSERVICEFN_SEND_RQ) references EXSSERVICEFN(RN),
constraint UDO_C_EQUIPDSCM_EXSFNSDRQCB_FK foreign key (EXSSERVICEFN_SEND_RQCB) references EXSSERVICEFN(RN),
- constraint UDO_C_EQUIPDSCM_UN unique (PRN, EQOBJKIND)
+ constraint UDO_C_EQUIPDSCM_UN unique (EQOBJKIND)
);
diff --git a/db/UDO_T_EQUIPDSCMML.sql b/db/UDO_T_EQUIPDSCMML.sql
index ac1ba14..b37cfa2 100644
--- a/db/UDO_T_EQUIPDSCMML.sql
+++ b/db/UDO_T_EQUIPDSCMML.sql
@@ -17,6 +17,8 @@ create table UDO_T_EQUIPDSCMML
ERR varchar2(4000) default null,
/* Идентификатор данных */
DATASET_ID number(17) not null,
+ /* Процедура формирования данных для прогнозирования */
+ USERPROCS_FRCST_DATA number(17) not null,
/* Ключи */
constraint UDO_C_EQUIPDSCMML_RN_PK primary key (RN),
constraint UDO_C_EQUIPDSCMML_PRN_FK foreign key (PRN) references UDO_T_EQUIPDSCM(RN),
@@ -28,6 +30,7 @@ create table UDO_T_EQUIPDSCMML
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)) and (ERR is null))),
+ constraint UDO_C_EQUIPDSCMML_USRPFD_FK foreign key (USERPROCS_FRCST_DATA) references USERPROCS(RN),
constraint UDO_C_EQUIPDSCMML_UN unique (PRN, TASK),
constraint UDO_C_EQUIPDSCMML_QID_UN unique (QUEUE_ID)
);