From 277af55060901643a9ffdfd4464da10f2a588278 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Tue, 18 Mar 2025 11:19:49 +0300 Subject: [PATCH] =?UTF-8?q?"=D0=9A=D0=BB=D0=B0=D1=81=D1=81=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F"?= =?UTF-8?q?=20=D1=83=D0=BD=D0=B8=D0=BA=D0=B0=D0=BB=D0=B5=D0=BD=20=D0=B2?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5,=20=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B2=20=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=BA=D0=B0=D1=85=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BA?= =?UTF-8?q?=D0=B8,=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83=D1=80=D1=83=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B3=D0=BD=D0=BE=D0=B7=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/UDO_PKG_EQUIPDS.pck | 53 +++++++++++++++++----- db/UDO_PKG_EQUIPDS_BASE.pck | 89 ++++++++++++++++++++++++++++--------- db/UDO_T_EQUIPDSCM.sql | 2 +- db/UDO_T_EQUIPDSCMML.sql | 3 ++ 4 files changed, 113 insertions(+), 34 deletions(-) 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) );