diff --git a/db/UDO_PKG_EQUIPDS.pck b/db/UDO_PKG_EQUIPDS.pck index 65524b9..40c0707 100644 --- a/db/UDO_PKG_EQUIPDS.pck +++ b/db/UDO_PKG_EQUIPDS.pck @@ -20,6 +20,25 @@ create or replace package UDO_PKG_EQUIPDS as NRN in number -- Регистрационный номер ); + /* Клиентское формирование "Выборки данных оборудования" по классу технического объекта */ + procedure MAKE + ( + SEQUIPDS in varchar2, -- Выборка данных оборудования + SEQOBJKIND in varchar2, -- Класс оборудования + SDICMUNTS in varchar2, -- Единица измерения выборки + SUSERPROCS_DATA in varchar2, -- Процедура формирования + SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных + SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных + SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе + 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)) + NPRECISION_P in number, -- Точность (план) + NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования + NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных + ); + /* Карточка "Выборки данных оборудования (классы оборудования)" */ procedure CM_CARD ( @@ -39,6 +58,7 @@ create or replace package UDO_PKG_EQUIPDS as ( NPRN in number, -- Родитель SEQOBJKIND in varchar2, -- Класс оборудования + SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных @@ -153,6 +173,7 @@ text="Проверка прав доступа на работу с ""Выбор NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Обходим выборки данных */ for C in (select T.RN NRN, + T.CODE SCODE, T.NAME SNAME from UDO_T_EQUIPDS T where T.COMPANY = NCOMPANY @@ -167,6 +188,9 @@ text="Проверка прав доступа на работу с ""Выбор SNAME => 'NRN', SVALUE => C.NRN), RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'SCODE', + SVALUE => C.SCODE), + RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SNAME', SVALUE => C.SNAME)))); end loop; @@ -209,6 +233,69 @@ text="Проверка прав доступа на работу с ""Выбор UDO_PKG_EQUIPDS_BASE.DEL(NRN => NRN, NCOMPANY => NCOMPANY); end DEL; + /* Клиентское формирование "Выборки данных оборудования" по классу технического объекта */ + procedure MAKE + ( + SEQUIPDS in varchar2, -- Выборка данных оборудования + SEQOBJKIND in varchar2, -- Класс оборудования + SDICMUNTS in varchar2, -- Единица измерения выборки + SUSERPROCS_DATA in varchar2, -- Процедура формирования + SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных + SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных + SEXSSERVICE_SEND_MD in varchar2, -- Сервис обмена для передачи внешней системе + 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)) + NPRECISION_P in number, -- Точность (план) + NEQUIPDS out number, -- Регистрационный номер выборки данных оборудования + NEQUIPDSCM out number -- Регистрационный номер класса оборудования выборки данных + ) + is + NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация + NEQUIPDSCMML PKG_STD.TREF; -- Рег. номер модели + begin + /* Проверим наличие такой выборки */ + UDO_PKG_EQUIPDS_BASE.FIND_BY_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SEQUIPDS, NRN => NEQUIPDS); + /* Выборки нет */ + if (NEQUIPDS is null) then + /* Добавим выборку данных */ + INS(SCODE => SEQUIPDS, SNAME => SEQUIPDS, NRN => NEQUIPDS); + else + /* Выборка есть - надо проверить в ней наличие класса оборудования */ + UDO_PKG_EQUIPDS_BASE.CM_FIND_BY_EQOBJKIND(NFLAG_SMART => 1, + NPRN => NEQUIPDS, + SEQOBJKIND => SEQOBJKIND, + NRN => NEQUIPDSCM); + end if; + /* Класса оборудования в выборке нет */ + if (NEQUIPDSCM is null) then + /* Добавляем запись класса оборудования */ + CM_INS(NPRN => NEQUIPDS, + SEQOBJKIND => SEQOBJKIND, + SDICMUNTS => SDICMUNTS, + SUSERPROCS_DATA => SUSERPROCS_DATA, + SEXSSERVICE_UPLOAD => SEXSSERVICE_UPLOAD, + SEXSSERVICEFN_UPLOAD => SEXSSERVICEFN_UPLOAD, + SEXSSERVICE_SEND_MD => SEXSSERVICE_SEND_MD, + SEXSSERVICEFN_SEND_MD => SEXSSERVICEFN_SEND_MD, + SEXSSERVICE_SEND_RQ => SEXSSERVICE_SEND_RQ, + SEXSSERVICEFN_SEND_RQ => SEXSSERVICEFN_SEND_RQ, + NRN => NEQUIPDSCM); + end if; + /* Проверим наличие такой модели */ + UDO_PKG_EQUIPDS_BASE.CMML_FIND_BY_TASK(NFLAG_SMART => 1, + NPRN => NEQUIPDSCM, + STASK => STASK, + NPRECISION_P => NPRECISION_P, + NRN => NEQUIPDSCMML); + /* Модели нет */ + if (NEQUIPDSCMML is null) then + /* Добавим модель */ + CMML_INS(NPRN => NEQUIPDSCM, STASK => STASK, NPRECISION_P => NPRECISION_P, NRN => NEQUIPDSCMML); + end if; + end MAKE; + /* Карточка "Выборки данных оборудования (классы оборудования)" */ procedure CM_CARD ( @@ -298,13 +385,28 @@ text="Проверка прав доступа на работу с ""Выбор /* Открываем документ */ NCUR := PKG_XMAKE.OPEN_CURSOR(); /* Обходим классы оборудования заданной выборки данных */ - for C in (select T.RN NRN, - OK.CODE SCODE, - OK.NAME SNAME + for C in (select T.RN NRN, + OK.CODE SCODE, + OK.NAME SNAME, + DM.MEAS_MNEMO SDICMUNTS, + UPD.CODE SUSERPROCS_DATA, + UPL.CODE SEXSSERVICEFN_UPLOAD, + SMD.CODE SEXSSERVICEFN_SEND_MD, + SRQ.CODE SEXSSERVICEFN_SEND_RQ from UDO_T_EQUIPDSCM T, - EQOBJKIND OK + EQOBJKIND OK, + DICMUNTS DM, + USERPROCS UPD, + EXSSERVICEFN UPL, + EXSSERVICEFN SMD, + EXSSERVICEFN SRQ where T.PRN = NEQUIPDS and T.EQOBJKIND = OK.RN + and T.DICMUNTS = DM.RN + and T.USERPROCS_DATA = UPD.RN + and T.EXSSERVICEFN_UPLOAD = UPL.RN + and T.EXSSERVICEFN_SEND_MD = SMD.RN + and T.EXSSERVICEFN_SEND_RQ = SRQ.RN order by OK.CODE) loop XDSCM := PKG_XMAKE.CONCAT(ICURSOR => NCUR, @@ -320,7 +422,22 @@ text="Проверка прав доступа на работу с ""Выбор SVALUE => C.SCODE), RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'SNAME', - SVALUE => C.SNAME)))); + SVALUE => C.SNAME), + RATTRIBUTE03 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'SDICMUNTS', + SVALUE => C.SDICMUNTS), + RATTRIBUTE04 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'SUSERPROCS_DATA', + SVALUE => C.SUSERPROCS_DATA), + RATTRIBUTE05 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'SEXSSERVICEFN_UPLOAD', + SVALUE => C.SEXSSERVICEFN_UPLOAD), + RATTRIBUTE06 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'SEXSSERVICEFN_SEND_MD', + SVALUE => C.SEXSSERVICEFN_SEND_MD), + RATTRIBUTE07 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'SEXSSERVICEFN_SEND_RQ', + SVALUE => C.SEXSSERVICEFN_SEND_RQ)))); end loop; /* Формируем XML-представление ответа */ XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XDSCM); @@ -340,6 +457,7 @@ text="Проверка прав доступа на работу с ""Выбор ( NPRN in number, -- Родитель SEQOBJKIND in varchar2, -- Класс оборудования + SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных @@ -352,6 +470,7 @@ text="Проверка прав доступа на работу с ""Выбор is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация NEQOBJKIND PKG_STD.TREF; -- Рег. номер класса оборудования + NDICMUNTS PKG_STD.TREF; -- Рег. номер единицы измерения выборки NUSERPROCS_DATA PKG_STD.TREF; -- Рег. номер процедуры формирования NEXSSERVICEFN_UPLOAD PKG_STD.TREF; -- Рег. номер функции обмена для выгрузки данных NEXSSERVICEFN_SEND_MD PKG_STD.TREF; -- Рег. номер Функции обмена для передачи внешней системе @@ -360,6 +479,7 @@ text="Проверка прав доступа на работу с ""Выбор /* Разыменуем ссылки */ UDO_PKG_EQUIPDS_BASE.CM_JOINS(NCOMPANY => NCOMPANY, SEQOBJKIND => SEQOBJKIND, + SDICMUNTS => SDICMUNTS, SUSERPROCS_DATA => SUSERPROCS_DATA, SEXSSERVICE_UPLOAD => SEXSSERVICE_UPLOAD, SEXSSERVICEFN_UPLOAD => SEXSSERVICEFN_UPLOAD, @@ -368,6 +488,7 @@ text="Проверка прав доступа на работу с ""Выбор SEXSSERVICE_SEND_RQ => SEXSSERVICE_SEND_RQ, SEXSSERVICEFN_SEND_RQ => SEXSSERVICEFN_SEND_RQ, NEQOBJKIND => NEQOBJKIND, + NDICMUNTS => NDICMUNTS, NUSERPROCS_DATA => NUSERPROCS_DATA, NEXSSERVICEFN_UPLOAD => NEXSSERVICEFN_UPLOAD, NEXSSERVICEFN_SEND_MD => NEXSSERVICEFN_SEND_MD, @@ -375,6 +496,7 @@ text="Проверка прав доступа на работу с ""Выбор /* Добавляем запись */ UDO_PKG_EQUIPDS_BASE.CM_INS(NPRN => NPRN, NEQOBJKIND => NEQOBJKIND, + NDICMUNTS => NDICMUNTS, NUSERPROCS_DATA => NUSERPROCS_DATA, NEXSSERVICEFN_UPLOAD => NEXSSERVICEFN_UPLOAD, NEXSSERVICEFN_SEND_MD => NEXSSERVICEFN_SEND_MD, @@ -624,7 +746,9 @@ text="Проверка прав доступа на работу с ""Выбор and CM.RN = ML.PRN) loop /* Модель есть */ - NRES := 1; + if (NRES < 2) then + NRES := 1; + end if; /* Если она уже обучена */ if (C.STATUS = 2) then NRES := 2; diff --git a/db/UDO_PKG_EQUIPDS_BASE.pck b/db/UDO_PKG_EQUIPDS_BASE.pck index fed2c4c..1919b93 100644 --- a/db/UDO_PKG_EQUIPDS_BASE.pck +++ b/db/UDO_PKG_EQUIPDS_BASE.pck @@ -1,5 +1,21 @@ create or replace package UDO_PKG_EQUIPDS_BASE as + /* Считывание записи "Выборки данных оборудования" по регистрационному номеру */ + function GET + ( + NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать) + NRN in number -- Регистрационный номер + ) return UDO_T_EQUIPDS%rowtype; -- Запись выборки данных оборудования + + /* Поиск "Выборки данных оборудования" по мнемокоду */ + procedure FIND_BY_CODE + ( + NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать) + NCOMPANY in number, -- Организация + SCODE in varchar2, -- Мнемокод + NRN out number -- Регистрационный номер + ); + /* Базовое добавление "Выборки данных оборудования" */ procedure INS ( @@ -25,11 +41,28 @@ create or replace package UDO_PKG_EQUIPDS_BASE as NCOMPANY in number -- Организация ); + /* Считывание записи "Выборки данных оборудования (классы оборудования)" по регистрационному номеру */ + function CM_GET + ( + NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать) + NRN in number -- Регистрационный номер + ) return UDO_T_EQUIPDSCM%rowtype; -- Запись класса оборудования выборки данных + + /* Поиск "Выборки данных оборудования (классы оборудования)" по классу оборудования */ + procedure CM_FIND_BY_EQOBJKIND + ( + NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать) + NPRN in number, -- Родитель + SEQOBJKIND in varchar2, -- Класс оборудования + NRN out number -- Регистрационный номер + ); + /* Разыменование словарей "Выборки данных оборудования (классы оборудования)" */ procedure CM_JOINS ( NCOMPANY in number, -- Организация SEQOBJKIND in varchar2, -- Класс оборудования + SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных @@ -38,6 +71,7 @@ create or replace package UDO_PKG_EQUIPDS_BASE as SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой NEQOBJKIND out number, -- Рег. номер класса оборудования + NDICMUNTS out number, -- Рег. номер единицы измерения выборки NUSERPROCS_DATA out number, -- Рег. номер процедуры формирования NEXSSERVICEFN_UPLOAD out number, -- Рег. номер функции обмена для выгрузки данных NEXSSERVICEFN_SEND_MD out number, -- Рег. номер Функции обмена для передачи внешней системе @@ -49,6 +83,7 @@ create or replace package UDO_PKG_EQUIPDS_BASE as ( NPRN in number, -- Родитель NEQOBJKIND in number, -- Класс оборудования + NDICMUNTS in number, -- Единица измерения выборки NUSERPROCS_DATA in number, -- Процедура формирования NEXSSERVICEFN_UPLOAD in number, -- Функция обмена для выгрузки данных NEXSSERVICEFN_SEND_MD in number, -- Функция обмена для передачи внешней системе @@ -61,6 +96,7 @@ create or replace package UDO_PKG_EQUIPDS_BASE as ( NRN in number, -- Регистрационный номер NEQOBJKIND in number, -- Класс оборудования + NDICMUNTS in number, -- Единица измерения выборки NUSERPROCS_DATA in number, -- Процедура формирования NEXSSERVICEFN_UPLOAD in number, -- Функция обмена для выгрузки данных NEXSSERVICEFN_SEND_MD in number, -- Функция обмена для передачи внешней системе @@ -104,6 +140,16 @@ create or replace package UDO_PKG_EQUIPDS_BASE as SERR in varchar2 -- Сообщение об ошибке ); + /* Поиск "Выборки данных оборудования (классы оборудования, модели)" по задаче */ + 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)) */ + NPRECISION_P in number, -- Точность (план) + NRN out number -- Регистрационный номер + ); + /* Базовое добавление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_INS ( @@ -182,6 +228,51 @@ end UDO_PKG_EQUIPDS_BASE; / create or replace package body UDO_PKG_EQUIPDS_BASE as + /* Считывание записи "Выборки данных оборудования" по регистрационному номеру */ + function GET + ( + NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать) + NRN in number -- Регистрационный номер + ) return UDO_T_EQUIPDS%rowtype -- Запись выборки данных оборудования + is + RES UDO_T_EQUIPDS%rowtype; -- Буфер для результата + begin + /* Считывание записи */ + begin + select T.* into RES from UDO_T_EQUIPDS 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_EQUIPDS'); + end; + /* Возврат результата */ + return RES; + end GET; + + /* Поиск "Выборки данных оборудования" по мнемокоду */ + procedure FIND_BY_CODE + ( + NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать) + NCOMPANY in number, -- Организация + SCODE in varchar2, -- Мнемокод + NRN out number -- Регистрационный номер + ) + is + begin + /* Поиск записи */ + begin + select RN + into NRN + from UDO_T_EQUIPDS T + where T.COMPANY = NCOMPANY + and T.CODE = SCODE; + exception + when NO_DATA_FOUND then + P_EXCEPTION(NFLAG_SMART, + 'Выборка данных оборудования "%s" не определёна.', + SCODE); + end; + end FIND_BY_CODE; + /* Базовое добавление "Выборки данных оборудования" */ procedure INS ( @@ -230,11 +321,60 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as and T.COMPANY = NCOMPANY; end DEL; + /* Считывание записи "Выборки данных оборудования (классы оборудования)" по регистрационному номеру */ + function CM_GET + ( + NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать) + NRN in number -- Регистрационный номер + ) return UDO_T_EQUIPDSCM%rowtype -- Запись класса оборудования выборки данных + is + RES UDO_T_EQUIPDSCM%rowtype; -- Буфер для результата + begin + /* Считывание записи */ + begin + select T.* into RES from UDO_T_EQUIPDSCM 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_EQUIPDSCM'); + end; + /* Возврат результата */ + return RES; + end CM_GET; + + /* Поиск "Выборки данных оборудования (классы оборудования)" по классу оборудования */ + procedure CM_FIND_BY_EQOBJKIND + ( + NFLAG_SMART in number, -- Признак выдачи сообщения об ошибке (0 - выдавать, 1 - не выдавать) + NPRN in number, -- Родитель + SEQOBJKIND in varchar2, -- Класс оборудования + NRN out number -- Регистрационный номер + ) + is + begin + /* Поиск записи */ + 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; + exception + when NO_DATA_FOUND then + P_EXCEPTION(NFLAG_SMART, + 'Класс оборудования "%s" в выборке данных "%s" не определён.', + SEQOBJKIND, + TO_CHAR(NPRN)); + end; + end CM_FIND_BY_EQOBJKIND; + /* Разыменование словарей "Выборки данных оборудования (классы оборудования)" */ procedure CM_JOINS ( NCOMPANY in number, -- Организация SEQOBJKIND in varchar2, -- Класс оборудования + SDICMUNTS in varchar2, -- Единица измерения выборки SUSERPROCS_DATA in varchar2, -- Процедура формирования SEXSSERVICE_UPLOAD in varchar2, -- Сервис обмена для выгрузки данных SEXSSERVICEFN_UPLOAD in varchar2, -- Функция обмена для выгрузки данных @@ -243,6 +383,7 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as SEXSSERVICE_SEND_RQ in varchar2, -- Сервис обмена для обработки внешней системой SEXSSERVICEFN_SEND_RQ in varchar2, -- Функция обмена для обработки внешней системой NEQOBJKIND out number, -- Рег. номер класса оборудования + NDICMUNTS out number, -- Рег. номер единицы измерения выборки NUSERPROCS_DATA out number, -- Рег. номер процедуры формирования NEXSSERVICEFN_UPLOAD out number, -- Рег. номер функции обмена для выгрузки данных NEXSSERVICEFN_SEND_MD out number, -- Рег. номер Функции обмена для передачи внешней системе @@ -257,6 +398,12 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as NCOMPANY => NCOMPANY, SCODE => SEQOBJKIND, NRN => NEQOBJKIND); + /* Единица измерения */ + FIND_DICMUNTS_CODE(NFLAG_SMART => 0, + NFLAG_OPTION => 0, + NCOMPANY => NCOMPANY, + SMEAS_MNEMO => SDICMUNTS, + NRN => NDICMUNTS); /* Процедура формирования */ if (SUSERPROCS_DATA is not null) then FIND_USERPROCS_CODE(NFLAG_SMART => 0, SCODE => SUSERPROCS_DATA, NRN => NUSERPROCS_DATA); @@ -291,6 +438,7 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as ( NPRN in number, -- Родитель NEQOBJKIND in number, -- Класс оборудования + NDICMUNTS in number, -- Единица измерения выборки NUSERPROCS_DATA in number, -- Процедура формирования NEXSSERVICEFN_UPLOAD in number, -- Функция обмена для выгрузки данных NEXSSERVICEFN_SEND_MD in number, -- Функция обмена для передачи внешней системе @@ -306,6 +454,7 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as (RN, PRN, EQOBJKIND, + DICMUNTS, DATA_CONFIG, USERPROCS_DATA, EXSSERVICEFN_UPLOAD, @@ -315,6 +464,7 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as (NRN, NPRN, NEQOBJKIND, + NDICMUNTS, null, NUSERPROCS_DATA, NEXSSERVICEFN_UPLOAD, @@ -327,6 +477,7 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as ( NRN in number, -- Регистрационный номер NEQOBJKIND in number, -- Класс оборудования + NDICMUNTS in number, -- Единица измерения выборки NUSERPROCS_DATA in number, -- Процедура формирования NEXSSERVICEFN_UPLOAD in number, -- Функция обмена для выгрузки данных NEXSSERVICEFN_SEND_MD in number, -- Функция обмена для передачи внешней системе @@ -337,6 +488,7 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as /* Исправим данные */ update UDO_T_EQUIPDSCM T set T.EQOBJKIND = NEQOBJKIND, + T.DICMUNTS = NDICMUNTS, T.USERPROCS_DATA = NUSERPROCS_DATA, T.EXSSERVICEFN_UPLOAD = NEXSSERVICEFN_UPLOAD, T.EXSSERVICEFN_SEND_MD = NEXSSERVICEFN_SEND_MD, @@ -425,6 +577,35 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as where T.RN = NRN; end CMFL_SET_STATUS; + /* Поиск "Выборки данных оборудования (классы оборудования, модели)" по задаче */ + 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)) */ + NPRECISION_P in number, -- Точность (план) + NRN out number -- Регистрационный номер + ) + is + begin + /* Поиск записи */ + begin + select T.RN + into NRN + from UDO_T_EQUIPDSCMML T + where T.PRN = NPRN + and T.TASK = STASK + and T.PRECISION_P = NPRECISION_P; + exception + when NO_DATA_FOUND then + P_EXCEPTION(NFLAG_SMART, + 'Модель с задачей "%s" и точностью "%s" в классе оборудования "%s" не определёна.', + STASK, + TO_CHAR(NPRECISION_P), + TO_CHAR(NPRN)); + end; + end CMML_FIND_BY_TASK; + /* Базовое добавление "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_INS ( diff --git a/db/UDO_PKG_EQUIPTCF.pck b/db/UDO_PKG_EQUIPTCF.pck index 7deff7a..38c92a6 100644 --- a/db/UDO_PKG_EQUIPTCF.pck +++ b/db/UDO_PKG_EQUIPTCF.pck @@ -258,6 +258,16 @@ text="Проверка прав доступа при формировании SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, BORDER => true, BFILTER => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SOBJ_KIND_FULL_CODE', + SCAPTION => 'Класс (полный иерархический код)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SUMEAS_RES', + SCAPTION => 'Единица измерения ресурса', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 2); @@ -283,9 +293,12 @@ text="Проверка прав доступа при формировании PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ST.CODE SUSE_KIND,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.OBJ_KIND NOBJ_KIND,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' OK.NAME SOBJ_KIND,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FORMAT_HIER_NAME(OK.COMPANY, null, OK.FULLCODE) SOBJ_KIND_FULL_CODE,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DM.MEAS_MNEMO SUMEAS_RES,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'UDO_PKG_EQUIPDS.CMML_STATUS_BY_EQCONFIG') || '(C.RN) NCMML_STATUS'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from EQCONFIG C'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join HLSTATETYPES ST on C.HLSTATETYPES = ST.RN,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join HLSTATETYPES ST on C.HLSTATETYPES = ST.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join DICMUNTS DM on C.UMEAS_RES = DM.RN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQOBJKIND OK'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where C.EQPARENT = :NEQPARENT'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and C.OBJ_KIND = OK.RN'); @@ -316,8 +329,10 @@ text="Проверка прав доступа при формировании PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 7); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 8); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 9); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11); /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; @@ -349,10 +364,18 @@ text="Проверка прав доступа при формировании SNAME => 'SOBJ_KIND', ICURSOR => ICURSOR, NPOSITION => 7); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SOBJ_KIND_FULL_CODE', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SUMEAS_RES', + ICURSOR => ICURSOR, + NPOSITION => 9); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NCMML_STATUS', ICURSOR => ICURSOR, - NPOSITION => 8); + NPOSITION => 10); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; diff --git a/db/UDO_T_EQUIPDSCM.sql b/db/UDO_T_EQUIPDSCM.sql index 111fe67..3574f7e 100644 --- a/db/UDO_T_EQUIPDSCM.sql +++ b/db/UDO_T_EQUIPDSCM.sql @@ -7,11 +7,13 @@ create table UDO_T_EQUIPDSCM PRN number(17) not null, /* Класс оборудования */ EQOBJKIND number(17) not null, + /* Единица измерения выборки */ + DICMUNTS number(17) not null, /* Описание структуры выборки */ DATA_CONFIG clob, /* Процедура формирования */ USERPROCS_DATA number(17) not null, - /* Функция обмена для выгрузки на FTP */ + /* Функция обмена для выгрузки на внешний сервер */ EXSSERVICEFN_UPLOAD number(17) not null, /* Функция обмена для передачи внешней системе */ EXSSERVICEFN_SEND_MD number(17) not null, @@ -21,6 +23,7 @@ create table UDO_T_EQUIPDSCM constraint UDO_C_EQUIPDSCM_RN_PK primary key (RN), constraint UDO_C_EQUIPDSCM_PRN_FK foreign key (PRN) references UDO_T_EQUIPDS(RN), constraint UDO_C_EQUIPDSCM_EQOBJKIND_FK foreign key (EQOBJKIND) references EQOBJKIND(RN), + constraint UDO_C_EQUIPDSCM_DICMUNTS_FK foreign key (DICMUNTS) references DICMUNTS(RN), constraint UDO_C_EQUIPDSCM_USRPD_FK foreign key (USERPROCS_DATA) references USERPROCS(RN), constraint UDO_C_EQUIPDSCM_EXSFNUPLD_FK foreign key (EXSSERVICEFN_UPLOAD) references EXSSERVICEFN(RN), constraint UDO_C_EQUIPDSCM_EXSFNSDMD_FK foreign key (EXSSERVICEFN_SEND_MD) references EXSSERVICEFN(RN), diff --git a/db/UDO_T_EQUIPDSCMML.sql b/db/UDO_T_EQUIPDSCMML.sql index d1f7a39..3fb491c 100644 --- a/db/UDO_T_EQUIPDSCMML.sql +++ b/db/UDO_T_EQUIPDSCMML.sql @@ -29,6 +29,6 @@ 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))), - constraint UDO_C_EQUIPDSCMML_UN unique (PRN, TASK, PRECISION_P, QUEUE_ID), + constraint UDO_C_EQUIPDSCMML_UN unique (PRN, TASK, PRECISION_P), constraint UDO_C_EQUIPDSCMML_QID_UN unique (QUEUE_ID) ); diff --git a/panels/eqs_tech_cond_forecast/admin_tab.js b/panels/eqs_tech_cond_forecast/admin_tab.js index d62e05c..eda0cc8 100644 --- a/panels/eqs_tech_cond_forecast/admin_tab.js +++ b/panels/eqs_tech_cond_forecast/admin_tab.js @@ -12,6 +12,7 @@ import PropTypes from "prop-types"; //Контроль свойств компо import { Box, Grid, Stack, Icon, Button, IconButton } from "@mui/material"; //Интерфейсные компоненты import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs +import { DS_RN_DEFAULT, useEquipDataSelectionList } from "./eqs_tech_cond_forecast_hooks"; //Общие вспомогательные хуки import { EquipDataSelectionIU, EquipDataSelectionList, @@ -21,8 +22,6 @@ import { EquipDataSelectionClassMachineModelIU } from "./admin_tab_layout"; //Вспомогательные компоненты и вёрстка import { - DS_RN_DEFAULT, - useEquipDataSelectionList, useEquipDataSelectionClassMachineList, useEquipDataSelectionClassMachineCard, useEquipDataSelectionClassMachineFilesList, @@ -35,9 +34,8 @@ import { //Начальное состояние флагов обновления const REFRESH_INITIAL = { - action: null, - dataSelection: null, - dataSelectionClassMachine: null, + dataSelection: 0, + dataSelectionClassMachine: 0, dataSelectionClassMachineCard: 0, dataSelectionClassMachineFilesList: 0, dataSelectionClassMachineModelsList: 0 @@ -113,7 +111,7 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n //При нажатии на "Удалить выборку" const handleDeleteEquipDataSelection = async () => { await executeStored({ stored: "UDO_PKG_EQUIPDS.DEL", args: { NRN: equipDataSelection } }); - setRefresh(pv => ({ ...pv, dataSelection: equipDataSelection * 2, action: "DEL" })); + setRefresh(pv => ({ ...pv, dataSelection: pv.dataSelection + 1 })); setDataSelection(DS_RN_DEFAULT); }; @@ -124,7 +122,8 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n const handleEquipDataSelectionIUOk = async values => { const data = await executeStored({ stored: "UDO_PKG_EQUIPDS.INS", args: { SCODE: values.code, SNAME: values.name } }); setDialogs(pv => ({ ...pv, dataSelectionIU: false })); - setRefresh(pv => ({ ...pv, dataSelection: data.NRN, action: "INS" })); + setRefresh(pv => ({ ...pv, dataSelection: pv.dataSelection + 1 })); + setDataSelection(data.NRN); }; //При нажатии на класс оборудования @@ -136,7 +135,7 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n //При нажатии на "Удалить класс оборудования" const handleDeleteEquipDataSelectionClassMachine = async equipDSCM => { await executeStored({ stored: "UDO_PKG_EQUIPDS.CM_DEL", args: { NRN: equipDSCM } }); - setRefresh(pv => ({ ...pv, dataSelectionClassMachine: equipDSCM * 2, action: "DEL" })); + setRefresh(pv => ({ ...pv, dataSelectionClassMachine: pv.dataSelectionClassMachine + 1 })); setDataSelectionClassMachine(null); }; @@ -150,6 +149,7 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n args: { NPRN: equipDataSelection, SEQOBJKIND: values.eqobjKind, + SDICMUNTS: values.measureUnit, SUSERPROCS_DATA: values.userprocsData, SEXSSERVICE_UPLOAD: values.exsServiceUpload, SEXSSERVICEFN_UPLOAD: values.exsServiceFnUpload, @@ -160,7 +160,8 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n } }); setDialogs(pv => ({ ...pv, dataSelectionClassMachineIU: false })); - setRefresh(pv => ({ ...pv, dataSelectionClassMachine: data.NRN, action: "INS" })); + setRefresh(pv => ({ ...pv, dataSelectionClassMachine: pv.dataSelectionClassMachine + 1 })); + setDataSelectionClassMachine(data.NRN); }; //При нажатии "Сформировать" в списке файлов карточки класса оборудования @@ -220,28 +221,15 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n //При измении выборки данных через свойства useEffect(() => { setDataSelection(dataSelection); + setRefresh(pv => ({ ...pv, dataSelection: pv.dataSelection + 1 })); }, [dataSelection]); //При изменеии класса оборудования через свойства useEffect(() => { setDataSelectionClassMachine(dataSelectionClassMachine); + setRefresh(pv => ({ ...pv, dataSelectionClassMachine: pv.dataSelectionClassMachine + 1 })); }, [dataSelectionClassMachine]); - //При изменении списка выборок данных - useEffect(() => { - if (refresh.action == "INS" && refresh.dataSelection) { - setDataSelection(refresh.dataSelection); - setDataSelectionClassMachine(null); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [equipDataSelectionList]); - - //При изменении списка классов оборудования выборки данных - useEffect(() => { - if (refresh.action == "INS" && refresh.dataSelectionClassMachine) setDataSelectionClassMachine(refresh.dataSelectionClassMachine); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [equipDataSelectionClassMachineList]); - //Генерация содержимого return ( @@ -278,7 +266,7 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n -