Исправлен алгоритм расчета вероятности выхода из строя, доработана карточка технического объекта (больше данных о прогнозе) и карточка интерапретации (даты выхода из строя относительного сегодняшнего дня, больше комментариев)
This commit is contained in:
parent
07976cbe82
commit
55519e072e
@ -205,9 +205,10 @@ create or replace package UDO_PKG_EQUIPDS as
|
|||||||
DFORECAST_DATE in date, -- Дата получения прогноза
|
DFORECAST_DATE in date, -- Дата получения прогноза
|
||||||
NFORECAST_DAYS in number, -- Прогнозное количество дней до выхода из строя (на дату прогноза)
|
NFORECAST_DAYS in number, -- Прогнозное количество дней до выхода из строя (на дату прогноза)
|
||||||
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.CMML_TASK_*)
|
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.CMML_TASK_*)
|
||||||
SFORECAST_DESC out varchar2, -- Краткое описание прогноза
|
SFORECAST out varchar2, -- Прогноз
|
||||||
SFORECAST_DESC_COLOR out varchar2, -- Цвет заливки прогноза
|
SFORECAST_DESC out varchar2, -- Интерпретация прогноза
|
||||||
CFORECAST out clob -- Данные детальной карточки прогноза
|
SFORECAST_DESC_COLOR out varchar2, -- Цвет заливки интерпретации прогноза
|
||||||
|
CFORECAST_CARD out clob -- Данные детальной карточки прогноза
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Список "Выборки данных оборудования (классы оборудования, модели, история запросов)" по единице оборудования */
|
/* Список "Выборки данных оборудования (классы оборудования, модели, история запросов)" по единице оборудования */
|
||||||
@ -1544,9 +1545,10 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
DFORECAST_DATE in date, -- Дата получения прогноза
|
DFORECAST_DATE in date, -- Дата получения прогноза
|
||||||
NFORECAST_DAYS in number, -- Прогнозное количество дней до выхода из строя (на дату прогноза)
|
NFORECAST_DAYS in number, -- Прогнозное количество дней до выхода из строя (на дату прогноза)
|
||||||
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.CMML_TASK_*)
|
STASK in varchar2, -- Задача (см. константы UDO_PKG_EQUIPDS_BASE.CMML_TASK_*)
|
||||||
SFORECAST_DESC out varchar2, -- Краткое описание прогноза
|
SFORECAST out varchar2, -- Прогноз
|
||||||
SFORECAST_DESC_COLOR out varchar2, -- Цвет заливки прогноза
|
SFORECAST_DESC out varchar2, -- Интерпретация прогноза
|
||||||
CFORECAST out clob -- Данные детальной карточки прогноза
|
SFORECAST_DESC_COLOR out varchar2, -- Цвет заливки интерпретации прогноза
|
||||||
|
CFORECAST_CARD out clob -- Данные детальной карточки прогноза
|
||||||
)
|
)
|
||||||
is
|
is
|
||||||
RCMMLH UDO_T_EQUIPDSCMMLH%rowtype; -- Запись истории запросов модели
|
RCMMLH UDO_T_EQUIPDSCMMLH%rowtype; -- Запись истории запросов модели
|
||||||
@ -1560,16 +1562,21 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
NBREAKDOWN_PROB_CUR PKG_STD.TNUMBER; -- Вероятность выхода из строя (для текущей позиции графика ТО и ремонтов/рем. ведомости)
|
NBREAKDOWN_PROB_CUR PKG_STD.TNUMBER; -- Вероятность выхода из строя (для текущей позиции графика ТО и ремонтов/рем. ведомости)
|
||||||
DNEXT_REPAIR PKG_STD.TLDATE; -- Дата ближайшего ТО и ремонта по графику/рем. ведомости
|
DNEXT_REPAIR PKG_STD.TLDATE; -- Дата ближайшего ТО и ремонта по графику/рем. ведомости
|
||||||
NFORECAST_DAYS_NOW PKG_STD.TNUMBER; -- Количество дней до выхода из строя согласно прогнозу, но от текущей даты
|
NFORECAST_DAYS_NOW PKG_STD.TNUMBER; -- Количество дней до выхода из строя согласно прогнозу, но от текущей даты
|
||||||
|
STASK_NAME PKG_STD.TSTRING; -- Текстовая расшифровка задачи
|
||||||
|
SFORECAST_DATE_CALC PKG_STD.TSTRING; -- Текстовое представление плановой даты перехода в предельное состояние
|
||||||
begin
|
begin
|
||||||
/* Считаем запись истории запросов к модели */
|
/* Считаем запись истории запросов к модели */
|
||||||
RCMMLH := UDO_PKG_EQUIPDS_BASE.CMMLH_GET(NFLAG_SMART => 0, NRN => NEQUIPDSCMMLH);
|
RCMMLH := UDO_PKG_EQUIPDS_BASE.CMMLH_GET(NFLAG_SMART => 0, NRN => NEQUIPDSCMMLH);
|
||||||
/* Проноз есть */
|
/* Проноз есть */
|
||||||
if ((DFORECAST_DATE is not null) and (NFORECAST_DAYS is not null)) then
|
if ((DFORECAST_DATE is not null) and (NFORECAST_DAYS is not null)) then
|
||||||
|
/* Получим текстовую расшифровку задачи */
|
||||||
|
STASK_NAME := UDO_PKG_EQUIPDS_BASE.CMML_TASK_NAME(STASK => STASK);
|
||||||
|
SFORECAST_DATE_CALC := TO_CHAR(DFORECAST_DATE + NFORECAST_DAYS, 'dd.mm.yyyy');
|
||||||
/* Вычислим сколько осталось до выхода из строя от текущей даты */
|
/* Вычислим сколько осталось до выхода из строя от текущей даты */
|
||||||
NFORECAST_DAYS_NOW := UDO_PKG_EQUIPDS_BASE.CMMLH_FORECAST_DAYS_NOW(DFORECAST_DATE => DFORECAST_DATE,
|
NFORECAST_DAYS_NOW := UDO_PKG_EQUIPDS_BASE.CMMLH_FORECAST_DAYS_NOW(DFORECAST_DATE => DFORECAST_DATE,
|
||||||
NFORECAST_DAYS => NFORECAST_DAYS);
|
NFORECAST_DAYS => NFORECAST_DAYS);
|
||||||
/* Вычислим вероятность выхода из строя до даты ближайшего ТО/ремонта по графику или рем. ведомости с учётом прогноза */
|
/* Вычислим вероятность выхода из строя до даты ближайшего ТО/ремонта по графику или рем. ведомости с учётом прогноза */
|
||||||
DNEXT_REPAIR := UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_GEN_NXTRPR(NEQCONFIG => RCMMLH.EQCONFIG);
|
DNEXT_REPAIR := UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_GEN_NXTRPR(NEQCONFIG => RCMMLH.EQCONFIG);
|
||||||
NBREAKDOWN_PROB := UDO_PKG_EQUIPDS_BASE.CMMLH_RUL_BREAKDOWN_PROB(DFORECAST_DATE => DFORECAST_DATE,
|
NBREAKDOWN_PROB := UDO_PKG_EQUIPDS_BASE.CMMLH_RUL_BREAKDOWN_PROB(DFORECAST_DATE => DFORECAST_DATE,
|
||||||
NFORECAST_DAYS => NFORECAST_DAYS,
|
NFORECAST_DAYS => NFORECAST_DAYS,
|
||||||
DDATE => DNEXT_REPAIR);
|
DDATE => DNEXT_REPAIR);
|
||||||
@ -1596,9 +1603,7 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR,
|
RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR,
|
||||||
SNAME => 'SFORECAST_DATE_CALC',
|
SNAME => 'SFORECAST_DATE_CALC',
|
||||||
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR,
|
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR,
|
||||||
SVALUE => TO_CHAR(DFORECAST_DATE +
|
SVALUE => SFORECAST_DATE_CALC)));
|
||||||
NFORECAST_DAYS,
|
|
||||||
'dd.mm.yyyy'))));
|
|
||||||
/* Заполним текущую дату */
|
/* Заполним текущую дату */
|
||||||
XROOT := PKG_XMAKE.CONCAT(ICURSOR => NCUR,
|
XROOT := PKG_XMAKE.CONCAT(ICURSOR => NCUR,
|
||||||
RNODE00 => XROOT,
|
RNODE00 => XROOT,
|
||||||
@ -1626,7 +1631,7 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR,
|
RNODE01 => PKG_XMAKE.ELEMENT(ICURSOR => NCUR,
|
||||||
SNAME => 'STASK_NAME',
|
SNAME => 'STASK_NAME',
|
||||||
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR,
|
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR,
|
||||||
SVALUE => UDO_PKG_EQUIPDS_BASE.CMML_TASK_NAME(STASK => STASK))));
|
SVALUE => STASK_NAME)));
|
||||||
/* Заполним дату следующего ТО и ремонта */
|
/* Заполним дату следующего ТО и ремонта */
|
||||||
XROOT := PKG_XMAKE.CONCAT(ICURSOR => NCUR,
|
XROOT := PKG_XMAKE.CONCAT(ICURSOR => NCUR,
|
||||||
RNODE00 => XROOT,
|
RNODE00 => XROOT,
|
||||||
@ -1675,6 +1680,9 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS);
|
PKG_P8PANELS_VISUAL.TCHART_ADD_DATASET(RCHART => RCH, RDATASET => RCH_DS);
|
||||||
/* Сериализуем график */
|
/* Сериализуем график */
|
||||||
CCHART := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1);
|
CCHART := PKG_P8PANELS_VISUAL.TCHART_TO_XML(RCHART => RCH, NINCLUDE_DEF => 1);
|
||||||
|
else
|
||||||
|
/* Запланированных ремонтов или ТО нет, но прогноз есть - значит точно выйдет из строя */
|
||||||
|
NBREAKDOWN_PROB := 100;
|
||||||
end if;
|
end if;
|
||||||
/* Заполним вероятность выхода из стороя до ближайшего ТО с учётом прогноза */
|
/* Заполним вероятность выхода из стороя до ближайшего ТО с учётом прогноза */
|
||||||
XROOT := PKG_XMAKE.CONCAT(ICURSOR => NCUR,
|
XROOT := PKG_XMAKE.CONCAT(ICURSOR => NCUR,
|
||||||
@ -1699,19 +1707,24 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR, LCVALUE => CCHART)));
|
RVALUE00 => PKG_XMAKE.VALUE(ICURSOR => NCUR, LCVALUE => CCHART)));
|
||||||
/* Формируем XML-представление ответа */
|
/* Формируем XML-представление ответа */
|
||||||
XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XROOT);
|
XDOC := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, SNAME => 'XDATA', RNODE00 => XROOT);
|
||||||
/* Конвертируем в CLOB */
|
/* Возвращаем полученные данные карточки - конвертируем XML-представление ответа в CLOB */
|
||||||
CFORECAST := PKG_XMAKE.SERIALIZE_TO_CLOB(ICURSOR => NCUR,
|
CFORECAST_CARD := PKG_XMAKE.SERIALIZE_TO_CLOB(ICURSOR => NCUR,
|
||||||
ITYPE => PKG_XMAKE.CONTENT_,
|
ITYPE => PKG_XMAKE.CONTENT_,
|
||||||
RNODE => XDOC,
|
RNODE => XDOC,
|
||||||
RHEADER => PKG_XHEADER.WRAP_ALL(SVERSION => PKG_XHEADER.VERSION_1_0_,
|
RHEADER => PKG_XHEADER.WRAP_ALL(SVERSION => PKG_XHEADER.VERSION_1_0_,
|
||||||
SENCODING => PKG_XHEADER.ENCODING_UTF_,
|
SENCODING => PKG_XHEADER.ENCODING_UTF_,
|
||||||
SSTANDALONE => PKG_XHEADER.STANDALONE_YES_));
|
SSTANDALONE => PKG_XHEADER.STANDALONE_YES_));
|
||||||
/* Закрываем документ */
|
/* Закрываем документ */
|
||||||
PKG_XMAKE.CLOSE_CURSOR(ICURSOR => NCUR);
|
PKG_XMAKE.CLOSE_CURSOR(ICURSOR => NCUR);
|
||||||
/* Возвращаем значение краткого описания прогноза */
|
/* Возвращаем текстовое описание прогноза */
|
||||||
|
SFORECAST := STASK_NAME || ' на дату выборки (' || TO_CHAR(DFORECAST_DATE, 'dd.mm.yyyy') || '): ' ||
|
||||||
|
TO_CHAR(NFORECAST_DAYS) || 'д (до ' || SFORECAST_DATE_CALC || ')';
|
||||||
|
/* Возвращаем интерпретацию прогноза */
|
||||||
SFORECAST_DESC := TO_CHAR(NFORECAST_DAYS_NOW) || 'Д / ' || TO_CHAR(ROUND(NBREAKDOWN_PROB)) || '%';
|
SFORECAST_DESC := TO_CHAR(NFORECAST_DAYS_NOW) || 'Д / ' || TO_CHAR(ROUND(NBREAKDOWN_PROB)) || '%';
|
||||||
/* Возвращаем значение цвета заливки описания прогноза */
|
/* Возвращаем цвета заливки интерпретации прогноза */
|
||||||
SFORECAST_DESC_COLOR := CMMLH_FORECAST_COLOR(NMODE => 1, NVALUE => NBREAKDOWN_PROB);
|
SFORECAST_DESC_COLOR := CMMLH_FORECAST_COLOR(NMODE => 1, NVALUE => NBREAKDOWN_PROB);
|
||||||
|
else
|
||||||
|
SFORECAST := 'Не удалось разобрать ответ модели';
|
||||||
end if;
|
end if;
|
||||||
end CMMLH_FORECAST_CARD;
|
end CMMLH_FORECAST_CARD;
|
||||||
|
|
||||||
@ -1744,7 +1757,8 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
SNAME => 'SEQUIPDS_CODE',
|
SNAME => 'SEQUIPDS_CODE',
|
||||||
SCAPTION => 'Выборка',
|
SCAPTION => 'Выборка',
|
||||||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||||||
|
BVISIBLE => false);
|
||||||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
SNAME => 'SEQUIPDSCMML_TASK',
|
SNAME => 'SEQUIPDSCMML_TASK',
|
||||||
SCAPTION => 'Задача',
|
SCAPTION => 'Задача',
|
||||||
@ -1753,22 +1767,27 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
SNAME => 'NEQUIPDSCMML_PRECISION',
|
SNAME => 'NEQUIPDSCMML_PRECISION',
|
||||||
SCAPTION => 'Точность',
|
SCAPTION => 'Точность',
|
||||||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB);
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||||||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
|
||||||
SNAME => 'STO_FORECAST_DESC',
|
|
||||||
SCAPTION => 'Прогноз',
|
|
||||||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
|
||||||
SHINT => '<b>Формат прогноза:</b> "XXД / YY%", где<br>' ||
|
|
||||||
'<b>XXД</b> - время (в днях, от текущей даты) до перехода в критическое состояние<br>' ||
|
|
||||||
'<b>YY%</b> - вероятность перехода в критическое состояние до следующего ТО и ремонта<br><br>' ||
|
|
||||||
'<b>Цвет прогноза:</b><br>' || CMMLH_FORECAST_COLOR(NMODE => 0));
|
|
||||||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
|
||||||
SNAME => 'STO_FORECAST_DESC_COLOR',
|
|
||||||
SCAPTION => 'Цвет прогноза',
|
|
||||||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
|
||||||
BVISIBLE => false);
|
BVISIBLE => false);
|
||||||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
SNAME => 'STO_FORECAST',
|
SNAME => 'STO_FORECAST',
|
||||||
|
SCAPTION => 'Ответ модели',
|
||||||
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR);
|
||||||
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
|
SNAME => 'STO_FORECAST_DESC',
|
||||||
|
SCAPTION => 'Интерпретация',
|
||||||
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||||||
|
SHINT => '<b>Формат:</b> "XXД / YY%", где<br>' ||
|
||||||
|
'<b>XXД</b> - время (в днях, от текущей даты) до перехода в критическое состояние<br>' ||
|
||||||
|
'<b>YY%</b> - вероятность перехода в критическое состояние до следующего ТО и ремонта<br><br>' ||
|
||||||
|
'<b>Цвет:</b><br>' || CMMLH_FORECAST_COLOR(NMODE => 0));
|
||||||
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
|
SNAME => 'STO_FORECAST_DESC_COLOR',
|
||||||
|
SCAPTION => 'Цвет интерпретации',
|
||||||
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||||||
|
BVISIBLE => false);
|
||||||
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
|
SNAME => 'STO_FORECAST_CARD',
|
||||||
SCAPTION => 'Данные карточки прогноза для конкретного технического объекта',
|
SCAPTION => 'Данные карточки прогноза для конкретного технического объекта',
|
||||||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||||||
BVISIBLE => false);
|
BVISIBLE => false);
|
||||||
@ -1789,9 +1808,10 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
T.FORECAST BFORECAST,
|
T.FORECAST BFORECAST,
|
||||||
T.FORECAST_DATE DFORECAST_DATE,
|
T.FORECAST_DATE DFORECAST_DATE,
|
||||||
T.FORECAST_DAYS NFORECAST_DAYS,
|
T.FORECAST_DAYS NFORECAST_DAYS,
|
||||||
|
null STO_FORECAST,
|
||||||
null STO_FORECAST_DESC,
|
null STO_FORECAST_DESC,
|
||||||
null STO_FORECAST_DESC_COLOR,
|
null STO_FORECAST_DESC_COLOR,
|
||||||
null STO_FORECAST
|
null STO_FORECAST_CARD
|
||||||
from UDO_T_EQUIPDSCMMLH T,
|
from UDO_T_EQUIPDSCMMLH T,
|
||||||
UDO_T_EQUIPDSCMML ML,
|
UDO_T_EQUIPDSCMML ML,
|
||||||
UDO_T_EQUIPDSCM CM,
|
UDO_T_EQUIPDSCM CM,
|
||||||
@ -1809,9 +1829,10 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
DFORECAST_DATE => C.DFORECAST_DATE,
|
DFORECAST_DATE => C.DFORECAST_DATE,
|
||||||
NFORECAST_DAYS => C.NFORECAST_DAYS,
|
NFORECAST_DAYS => C.NFORECAST_DAYS,
|
||||||
STASK => C.SEQUIPDSCMML_TASK,
|
STASK => C.SEQUIPDSCMML_TASK,
|
||||||
|
SFORECAST => C.STO_FORECAST,
|
||||||
SFORECAST_DESC => C.STO_FORECAST_DESC,
|
SFORECAST_DESC => C.STO_FORECAST_DESC,
|
||||||
SFORECAST_DESC_COLOR => C.STO_FORECAST_DESC_COLOR,
|
SFORECAST_DESC_COLOR => C.STO_FORECAST_DESC_COLOR,
|
||||||
CFORECAST => C.STO_FORECAST);
|
CFORECAST_CARD => C.STO_FORECAST_CARD);
|
||||||
/* Добавляем колонки с данными */
|
/* Добавляем колонки с данными */
|
||||||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true);
|
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => C.NRN, BCLEAR => true);
|
||||||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SRQ_AUTHID', SVALUE => C.SRQ_AUTHID);
|
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SRQ_AUTHID', SVALUE => C.SRQ_AUTHID);
|
||||||
@ -1821,11 +1842,12 @@ create or replace package body UDO_PKG_EQUIPDS as
|
|||||||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
|
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
|
||||||
SNAME => 'NEQUIPDSCMML_PRECISION',
|
SNAME => 'NEQUIPDSCMML_PRECISION',
|
||||||
NVALUE => C.NEQUIPDSCMML_PRECISION);
|
NVALUE => C.NEQUIPDSCMML_PRECISION);
|
||||||
|
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STO_FORECAST', SVALUE => C.STO_FORECAST);
|
||||||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STO_FORECAST_DESC', SVALUE => C.STO_FORECAST_DESC);
|
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STO_FORECAST_DESC', SVALUE => C.STO_FORECAST_DESC);
|
||||||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
|
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
|
||||||
SNAME => 'STO_FORECAST_DESC_COLOR',
|
SNAME => 'STO_FORECAST_DESC_COLOR',
|
||||||
SVALUE => C.STO_FORECAST_DESC_COLOR);
|
SVALUE => C.STO_FORECAST_DESC_COLOR);
|
||||||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STO_FORECAST', SVALUE => C.STO_FORECAST);
|
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'STO_FORECAST_CARD', SVALUE => C.STO_FORECAST_CARD);
|
||||||
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 => 'SDICMUNTS', SVALUE => C.SDICMUNTS);
|
||||||
/* Добавляем строку в таблицу */
|
/* Добавляем строку в таблицу */
|
||||||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
|
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
|
||||||
|
@ -1429,6 +1429,25 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
|||||||
end CMMLH_FORECAST_DAYS_NOW;
|
end CMMLH_FORECAST_DAYS_NOW;
|
||||||
|
|
||||||
/* Вычисление вероятности выхода из строя на дату по RUL-прогнозу */
|
/* Вычисление вероятности выхода из строя на дату по RUL-прогнозу */
|
||||||
|
/*
|
||||||
|
Описание алгоритма:
|
||||||
|
|
||||||
|
Считаем, что остаточный ресурс "k" - случайная величина, имеющая равномерную функцию распределения на интервале [a, b]
|
||||||
|
Необходимо определить вероятность того, что остаточный ресурс составит не менее "m" дней (P(k>=m)).
|
||||||
|
|
||||||
|
Здесь:
|
||||||
|
"k" - остаточный ресурс
|
||||||
|
"m" - количество дней, от текущего, до проверяемой даты (DDATE)
|
||||||
|
"a" - текущий день, 0
|
||||||
|
"b" - количество дней от текущего, до даты выхода из строя (DFORECAST_DATE + NFORECAST_DAYS), спрогнозированной фреймворком
|
||||||
|
|
||||||
|
Таким образом:
|
||||||
|
- вычисления невозможны, если хоть один из входных параметров неопределён, будем возвращать null
|
||||||
|
- если дата выхода из строя (DFORECAST_DATE + NFORECAST_DAYS) меньше текущей (т.е. b < a и интервал распределения неопределён), то считаем, что ресурс гарантировано меньше (P(k>=m) = 1)
|
||||||
|
- если проверяемая дата (DDATE) меньше текущей (т.е. не левее [a, b]) - вероятность 0, ресурс гарантировано больше (P(k>=m) = 0)
|
||||||
|
- если проверяемая дата (DDATE) больше даты выхода из строя (т.е. правее [a, b]) - вероятность 1, ресурс гарантировано меньше (P(k>=m) = 1)
|
||||||
|
- если проверяемая дата (DDATE) в диапазоне от текущей, до предсказанной даты выхода из строя (в [a, b]), то P(k>=m) = 1 - ((b - m)/(b - a))
|
||||||
|
*/
|
||||||
function CMMLH_RUL_BREAKDOWN_PROB
|
function CMMLH_RUL_BREAKDOWN_PROB
|
||||||
(
|
(
|
||||||
DFORECAST_DATE in date, -- Дата прогноза
|
DFORECAST_DATE in date, -- Дата прогноза
|
||||||
@ -1436,26 +1455,33 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
|||||||
DDATE in date -- Дата на
|
DDATE in date -- Дата на
|
||||||
) return number -- Значение вероятности
|
) return number -- Значение вероятности
|
||||||
is
|
is
|
||||||
|
DFORECAST_BREAKDOWN PKG_STD.TLDATE; -- Прогнозная дата выхода из строя
|
||||||
|
NB PKG_STD.TNUMBER; -- Правая граница диапазона распределения вероятности (количество дней от текущего до прогнозной даты выхода из строя)
|
||||||
|
NM PKG_STD.TNUMBER; -- Проверяемый аргумент (количество дней от текущего до проверяемой даты)
|
||||||
NRES PKG_STD.TNUMBER; -- Буфер для результата
|
NRES PKG_STD.TNUMBER; -- Буфер для результата
|
||||||
begin
|
begin
|
||||||
/* Проверим параметры */
|
/* Проверим параметры - должны быть заданы все параметры */
|
||||||
if ((NFORECAST_DAYS is null) or (DFORECAST_DATE is null) or (DDATE is null) or (DDATE < DFORECAST_DATE) or
|
if ((NFORECAST_DAYS is null) or (DFORECAST_DATE is null) or (DDATE is null)) then
|
||||||
(DFORECAST_DATE > sysdate) or (DDATE < sysdate)) then
|
|
||||||
return null;
|
return null;
|
||||||
end if;
|
end if;
|
||||||
/* Проверяем пограничные значения */
|
/* Вычислим дату выхода из строя */
|
||||||
if ((NFORECAST_DAYS = 0) or ((DDATE - sysdate) = 0)) then
|
DFORECAST_BREAKDOWN := DFORECAST_DATE + NFORECAST_DAYS;
|
||||||
|
/* Если прогнозируемая дата выхода из строя меньше текущей - ресурс гарантировано ниже */
|
||||||
|
if (DFORECAST_BREAKDOWN < sysdate) then
|
||||||
|
return 100;
|
||||||
|
end if;
|
||||||
|
/* Если проверяемя дата меньше текущей - ресурс гарантировано выше */
|
||||||
|
if (DDATE < sysdate) then
|
||||||
|
return 0;
|
||||||
|
end if;
|
||||||
|
/* Если проверяемя дата больше прогнозной дты выхода из строя - ресурс гарантировано ниже */
|
||||||
|
if (DDATE > DFORECAST_BREAKDOWN) then
|
||||||
return 100;
|
return 100;
|
||||||
end if;
|
end if;
|
||||||
/* Вычисляем */
|
/* Вычисляем */
|
||||||
NRES := 100 - ROUND((NFORECAST_DAYS - (TRUNC(sysdate) - TRUNC(DFORECAST_DATE))) / (DDATE - sysdate) * 100);
|
NB := DFORECAST_BREAKDOWN - sysdate;
|
||||||
/* Корректируем флуктуации */
|
NM := DDATE - sysdate;
|
||||||
if (NRES > 100) then
|
NRES := 100 - ROUND(((NB - NM) / NB) * 100);
|
||||||
NRES := 100;
|
|
||||||
end if;
|
|
||||||
if (NRES < 0) then
|
|
||||||
NRES := 0;
|
|
||||||
end if;
|
|
||||||
/* Возвращаем результат */
|
/* Возвращаем результат */
|
||||||
return NRES;
|
return NRES;
|
||||||
end CMMLH_RUL_BREAKDOWN_PROB;
|
end CMMLH_RUL_BREAKDOWN_PROB;
|
||||||
|
@ -962,7 +962,7 @@ text="Проверка прав доступа при формировании
|
|||||||
/* Читаем последнее значение из массива предсказаний (оно соответствует дате окончания из параметров прогноза) */
|
/* Читаем последнее значение из массива предсказаний (оно соответствует дате окончания из параметров прогноза) */
|
||||||
NLAST := PKG_XPATH.COUNT_NODES(RNODES => XFCTS);
|
NLAST := PKG_XPATH.COUNT_NODES(RNODES => XFCTS);
|
||||||
XLAST_FCT := PKG_XPATH.ITEM_NODE(RNODES => XFCTS, INUMBER => NLAST);
|
XLAST_FCT := PKG_XPATH.ITEM_NODE(RNODES => XFCTS, INUMBER => NLAST);
|
||||||
NLAST_INTERVALS := TO_CHAR(PKG_XPATH.VALUE(RNODE => XLAST_FCT, SPATTERN => 'SVALUE'));
|
NLAST_INTERVALS := PKG_XPATH.VALUE_NUM(RNODE => XLAST_FCT, SPATTERN => 'VALUE');
|
||||||
if (NLAST_INTERVALS < 0) then
|
if (NLAST_INTERVALS < 0) then
|
||||||
NLAST_INTERVALS := 0;
|
NLAST_INTERVALS := 0;
|
||||||
end if;
|
end if;
|
||||||
@ -1007,27 +1007,31 @@ text="Проверка прав доступа при формировании
|
|||||||
begin
|
begin
|
||||||
/* Определим дату ближайшего ТО или ремонта */
|
/* Определим дату ближайшего ТО или ремонта */
|
||||||
DCALC_DATE := EQCONFIG_THOBJ_GEN_NXTRPR(NEQCONFIG => NEQCONFIG);
|
DCALC_DATE := EQCONFIG_THOBJ_GEN_NXTRPR(NEQCONFIG => NEQCONFIG);
|
||||||
/* Если дата есть */
|
/* Вынем самый свежий прогноз */
|
||||||
if (DCALC_DATE is not null) then
|
for C in (select T.FORECAST_DATE DFORECAST_DATE,
|
||||||
/* Вынем самый свежий прогноз */
|
T.FORECAST_DAYS NFORECAST_DAYS
|
||||||
for C in (select T.FORECAST_DATE DFORECAST_DATE,
|
from UDO_T_EQUIPDSCMMLH T,
|
||||||
T.FORECAST_DAYS NFORECAST_DAYS
|
UDO_T_EQUIPDSCMML CMML
|
||||||
from UDO_T_EQUIPDSCMMLH T,
|
where T.EQCONFIG = NEQCONFIG
|
||||||
UDO_T_EQUIPDSCMML CMML
|
and T.PRN = CMML.RN
|
||||||
where T.EQCONFIG = NEQCONFIG
|
and CMML.TASK = UDO_PKG_EQUIPDS_BASE.SCMML_TASK_RUL
|
||||||
and T.PRN = CMML.RN
|
order by T.RQ_DATE desc)
|
||||||
and CMML.TASK = UDO_PKG_EQUIPDS_BASE.SCMML_TASK_RUL
|
loop
|
||||||
order by T.RQ_DATE desc)
|
DFORECAST_DATE := C.DFORECAST_DATE;
|
||||||
loop
|
NFORECAST_DAYS := C.NFORECAST_DAYS;
|
||||||
DFORECAST_DATE := C.DFORECAST_DATE;
|
exit;
|
||||||
NFORECAST_DAYS := C.NFORECAST_DAYS;
|
end loop;
|
||||||
exit;
|
/* Если есть прогноз */
|
||||||
end loop;
|
if ((DFORECAST_DATE is not null) and (NFORECAST_DAYS is not null)) then
|
||||||
/* Если есть и прогноз */
|
/* Если и дата ТО есть */
|
||||||
if (NFORECAST_DAYS is not null) then
|
if (DCALC_DATE is not null) then
|
||||||
|
/* Вычислим вероятность */
|
||||||
NRES := UDO_PKG_EQUIPDS_BASE.CMMLH_RUL_BREAKDOWN_PROB(DFORECAST_DATE => DFORECAST_DATE,
|
NRES := UDO_PKG_EQUIPDS_BASE.CMMLH_RUL_BREAKDOWN_PROB(DFORECAST_DATE => DFORECAST_DATE,
|
||||||
NFORECAST_DAYS => NFORECAST_DAYS,
|
NFORECAST_DAYS => NFORECAST_DAYS,
|
||||||
DDATE => DCALC_DATE);
|
DDATE => DCALC_DATE);
|
||||||
|
else
|
||||||
|
/* Запланированных ремонтов или ТО нет, но прогноз есть - значит точно выйдет из строя */
|
||||||
|
NRES := 100;
|
||||||
end if;
|
end if;
|
||||||
end if;
|
end if;
|
||||||
/* Вернём то, что собрали */
|
/* Вернём то, что собрали */
|
||||||
|
@ -58,7 +58,7 @@ const TECH_OBJ_SPEC_INITIAL = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//Начальное состояние выбранного технического объекта
|
//Начальное состояние выбранного технического объекта
|
||||||
const TECH_OBJ_INITIAL = { id: 20005565, objKind: null, measureUnit: null };
|
const TECH_OBJ_INITIAL = { id: null, objKind: null, measureUnit: null };
|
||||||
|
|
||||||
//Стили
|
//Стили
|
||||||
const STYLES = {
|
const STYLES = {
|
||||||
@ -224,50 +224,57 @@ const ForecastTab = ({ onGoToAdmin }) => {
|
|||||||
};
|
};
|
||||||
//Выполняем запрос
|
//Выполняем запрос
|
||||||
showLoader("Прогнозирование...");
|
showLoader("Прогнозирование...");
|
||||||
const response = await fetch(forecastReqData.SURL, {
|
let response = null;
|
||||||
method: "POST",
|
try {
|
||||||
body: JSON.stringify(body),
|
response = await fetch(forecastReqData.SURL, {
|
||||||
headers: {
|
method: "POST",
|
||||||
Authorization: `Basic ${forecastReqData.SAUTH_TOKEN}`,
|
body: JSON.stringify(body),
|
||||||
Accept: "*/*",
|
headers: {
|
||||||
"Content-Type": "application/json"
|
Authorization: `Basic ${forecastReqData.SAUTH_TOKEN}`,
|
||||||
}
|
Accept: "*/*",
|
||||||
});
|
"Content-Type": "application/json"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("Сетевая ошибка или ошибка внешнего сервера.");
|
||||||
|
}
|
||||||
//Обработаем результаты
|
//Обработаем результаты
|
||||||
if (response.status === 200) {
|
if (response) {
|
||||||
let responseJson;
|
if (response?.status === 200) {
|
||||||
try {
|
let responseJson;
|
||||||
responseJson = await response.json();
|
try {
|
||||||
} catch (e) {
|
responseJson = await response.json();
|
||||||
throw new Error("Неожиданный ответ системы прогнозирования: ответ неверного формата.");
|
} catch (e) {
|
||||||
}
|
throw new Error("Неожиданный ответ системы прогнозирования: ответ неверного формата.");
|
||||||
if (responseJson) {
|
}
|
||||||
if (responseJson?.status && responseJson.status == "ERR")
|
if (responseJson) {
|
||||||
throw new Error(`Ошибка формирования прогноза: ${responseJson.message}`);
|
if (responseJson?.status && responseJson.status == "ERR")
|
||||||
if (responseJson?.forecast && Array.isArray(responseJson?.forecast)) {
|
throw new Error(`Ошибка формирования прогноза: ${responseJson.message}`);
|
||||||
await executeStored({
|
if (responseJson?.forecast && Array.isArray(responseJson?.forecast)) {
|
||||||
stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_FORECAST_EPLG",
|
await executeStored({
|
||||||
args: {
|
stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_FORECAST_EPLG",
|
||||||
NDATASET_IDENT: res.outParameters.NDATASET_IDENT,
|
args: {
|
||||||
NDATASET_CONFIG_IDENT: res.outParameters.NDATASET_CONFIG_IDENT,
|
NDATASET_IDENT: res.outParameters.NDATASET_IDENT,
|
||||||
NREQUEST_CONFIG_IDENT: res.outParameters.NREQUEST_CONFIG_IDENT,
|
NDATASET_CONFIG_IDENT: res.outParameters.NDATASET_CONFIG_IDENT,
|
||||||
NEQCONFIG: techObj.id,
|
NREQUEST_CONFIG_IDENT: res.outParameters.NREQUEST_CONFIG_IDENT,
|
||||||
NEQUIPDSCMML: model.NRN,
|
NEQCONFIG: techObj.id,
|
||||||
CFORECAST: {
|
NEQUIPDSCMML: model.NRN,
|
||||||
VALUE: object2Base64XML(
|
CFORECAST: {
|
||||||
{ XDATA: { XFORECAST: responseJson.forecast.map(f => ({ STIME: f.time, SVALUE: f.value })) } },
|
VALUE: object2Base64XML(
|
||||||
{ arrayNodeName: "XFORECAST" }
|
{ XDATA: { XFORECAST: responseJson.forecast.map(f => ({ STIME: f.time, VALUE: f.value })) } },
|
||||||
),
|
{ arrayNodeName: "XFORECAST" }
|
||||||
SDATA_TYPE: SERV_DATA_TYPE_CLOB
|
),
|
||||||
}
|
SDATA_TYPE: SERV_DATA_TYPE_CLOB
|
||||||
},
|
}
|
||||||
loader: false
|
},
|
||||||
});
|
loader: false
|
||||||
hideLoader();
|
});
|
||||||
setRefresh(pv => ({ ...pv, techObjForecastHistList: pv.techObjForecastHistList + 1 }));
|
hideLoader();
|
||||||
} else throw new Error("Неожиданный ответ системы прогнозирования: ответ не содержит данных прогноза.");
|
setRefresh(pv => ({ ...pv, techObjForecastHistList: pv.techObjForecastHistList + 1 }));
|
||||||
} else throw new Error("Неожиданный ответ системы прогнозирования: ответ не содержит данных.");
|
} else throw new Error("Неожиданный ответ системы прогнозирования: ответ не содержит данных прогноза.");
|
||||||
} else throw new Error(`Ошибка (${response.status}) при взаимодейтсвии с системой прогнозирования.`);
|
} else throw new Error("Неожиданный ответ системы прогнозирования: ответ не содержит данных.");
|
||||||
|
} else throw new Error(`Ошибка (${response.status}) при взаимодейтсвии с системой прогнозирования.`);
|
||||||
|
} else throw new Error("Система прогнозирования не вернула ответ.");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
hideLoader();
|
hideLoader();
|
||||||
showMsgErr(e.message);
|
showMsgErr(e.message);
|
||||||
|
@ -63,7 +63,7 @@ const STYLES = {
|
|||||||
...SCROLL_STYLES
|
...SCROLL_STYLES
|
||||||
},
|
},
|
||||||
TECH_OBJ_FORECAST_DETAIL_DIALOG: { maxWidth: "600px" },
|
TECH_OBJ_FORECAST_DETAIL_DIALOG: { maxWidth: "600px" },
|
||||||
TECH_OBJ_FORECAST_DETAIL_CHART: { width: "550px", display: "flex", justifyContent: "center", paddingTop: "20px" },
|
TECH_OBJ_FORECAST_DETAIL_CHART: { display: "flex", alignItems: "center", justifyContent: "center", paddingTop: "20px" },
|
||||||
TECH_OBJ_MAKE_DATASET_DIALOG_CONTENT: { minHeight: "40vh", maxHeight: "40vh", ...SCROLL_STYLES },
|
TECH_OBJ_MAKE_DATASET_DIALOG_CONTENT: { minHeight: "40vh", maxHeight: "40vh", ...SCROLL_STYLES },
|
||||||
TECH_OBJ_MAKE_DATASET_DIALOG_TABS_CONTAINER: { borderBottom: 1, borderColor: "divider" },
|
TECH_OBJ_MAKE_DATASET_DIALOG_TABS_CONTAINER: { borderBottom: 1, borderColor: "divider" },
|
||||||
FORECAST_DETAIL_NOTE: { display: "block", marginTop: "-5px" }
|
FORECAST_DETAIL_NOTE: { display: "block", marginTop: "-5px" }
|
||||||
@ -130,8 +130,6 @@ const techObjCardForecastListTableHeadCellRender = ({ columnDef }) => {
|
|||||||
//Форматирование колонок таблицы истории прогнозов класса оборудования выборки данных
|
//Форматирование колонок таблицы истории прогнозов класса оборудования выборки данных
|
||||||
const techObjCardForecastListTableDataCellRender = ({ row, columnDef, onShowForecastDetail }) => {
|
const techObjCardForecastListTableDataCellRender = ({ row, columnDef, onShowForecastDetail }) => {
|
||||||
switch (columnDef.name) {
|
switch (columnDef.name) {
|
||||||
case "NEQUIPDSCMML_PRECISION":
|
|
||||||
return { data: `${row.NEQUIPDSCMML_PRECISION} ${row.SDICMUNTS}` };
|
|
||||||
case "STO_FORECAST_DESC":
|
case "STO_FORECAST_DESC":
|
||||||
return {
|
return {
|
||||||
cellProps: { align: "right" },
|
cellProps: { align: "right" },
|
||||||
@ -147,7 +145,17 @@ const techObjCardForecastListTableDataCellRender = ({ row, columnDef, onShowFore
|
|||||||
//Детали прогноза
|
//Детали прогноза
|
||||||
const ForecastDetail = ({ date, forecast, onClose }) => {
|
const ForecastDetail = ({ date, forecast, onClose }) => {
|
||||||
//Собственное состояние - сведения о прогнозе
|
//Собственное состояние - сведения о прогнозе
|
||||||
const [datails, setDetails] = useState({ taskName: null, forecast: null, meas: null, nextRepair: null, breakDown: null, breakDownColor: null });
|
const [details, setDetails] = useState({
|
||||||
|
taskName: null,
|
||||||
|
forecastDate: null,
|
||||||
|
forecastDays: null,
|
||||||
|
forecastDateCalc: null,
|
||||||
|
forecastDateNow: null,
|
||||||
|
forecastDaysNow: null,
|
||||||
|
nextRepair: null,
|
||||||
|
breakDown: null,
|
||||||
|
breakDownColor: null
|
||||||
|
});
|
||||||
|
|
||||||
//Собственное состояние - график
|
//Собственное состояние - график
|
||||||
const [chart, setChart] = useState({ loaded: false, available: true, labels: [], datasets: [] });
|
const [chart, setChart] = useState({ loaded: false, available: true, labels: [], datasets: [] });
|
||||||
@ -158,8 +166,11 @@ const ForecastDetail = ({ date, forecast, onClose }) => {
|
|||||||
const data = await xml2JSON({ xmlDoc: forecast });
|
const data = await xml2JSON({ xmlDoc: forecast });
|
||||||
setDetails({
|
setDetails({
|
||||||
taskName: data.XDATA.STASK_NAME,
|
taskName: data.XDATA.STASK_NAME,
|
||||||
forecast: data.XDATA.NFORECAST,
|
forecastDate: data.XDATA.SFORECAST_DATE,
|
||||||
meas: data.XDATA.SDICMUNTS,
|
forecastDays: data.XDATA.NFORECAST_DAYS,
|
||||||
|
forecastDateCalc: data.XDATA.SFORECAST_DATE_CALC,
|
||||||
|
forecastDateNow: data.XDATA.SFORECAST_DATE_NOW,
|
||||||
|
forecastDaysNow: data.XDATA.NFORECAST_DAYS_NOW,
|
||||||
nextRepair: data.XDATA.DNEXT_REPAIR,
|
nextRepair: data.XDATA.DNEXT_REPAIR,
|
||||||
breakDown: data.XDATA.NBREAKDOWN_PROB,
|
breakDown: data.XDATA.NBREAKDOWN_PROB,
|
||||||
breakDownColor: data.XDATA.SBREAKDOWN_PROB_COLOR
|
breakDownColor: data.XDATA.SBREAKDOWN_PROB_COLOR
|
||||||
@ -179,30 +190,51 @@ const ForecastDetail = ({ date, forecast, onClose }) => {
|
|||||||
<DialogTitle>{`Детали прогноза от ${date}`}</DialogTitle>
|
<DialogTitle>{`Детали прогноза от ${date}`}</DialogTitle>
|
||||||
<DialogContent>
|
<DialogContent>
|
||||||
<Typography variant="subtitle1">
|
<Typography variant="subtitle1">
|
||||||
{datails.taskName}: <b>{`${datails.forecast} ${datails.meas}`}</b>
|
{details.taskName} на дату выборки ({`${details.forecastDate}`}):{" "}
|
||||||
|
<b>{`${details.forecastDays} д (до ${details.forecastDateCalc})*`}</b>
|
||||||
|
</Typography>
|
||||||
|
<Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
|
||||||
|
*по данным фреймворка прогнозирования
|
||||||
|
</Typography>
|
||||||
|
<Typography variant="subtitle1">
|
||||||
|
{details.taskName} на сегодня ({`${details.forecastDateNow}`}): <b>{`${details.forecastDaysNow} д*`}</b>
|
||||||
|
</Typography>
|
||||||
|
<Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
|
||||||
|
*по данным фреймворка прогнозирования
|
||||||
</Typography>
|
</Typography>
|
||||||
<Stack direction={"row"}>
|
<Stack direction={"row"}>
|
||||||
<Typography variant="subtitle1">Дата следующего ТО/ремонта: </Typography>
|
<Typography variant="subtitle1">Дата следующего ТО/ремонта: </Typography>
|
||||||
<Typography variant="subtitle1" color={datails.nextRepair ? "" : "error.main"}>
|
<Typography variant="subtitle1" color={details.nextRepair ? "" : "error.main"}>
|
||||||
<b>{datails.nextRepair ? `${formatDateRF(datails.nextRepair)}*` : "Нет графиков ТО и ремонтов/ремонтых ведомостей"}</b>
|
<b>{details.nextRepair ? `${formatDateRF(details.nextRepair)}*` : "Нет графиков ТО и ремонтов/ремонтых ведомостей"}</b>
|
||||||
</Typography>
|
</Typography>
|
||||||
</Stack>
|
</Stack>
|
||||||
{datails.nextRepair ? (
|
{details.nextRepair ? (
|
||||||
<Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
|
<Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
|
||||||
*по графику/ремонтной ведомости
|
*по графику/ремонтной ведомости
|
||||||
</Typography>
|
</Typography>
|
||||||
) : null}
|
) : null}
|
||||||
<Stack direction={"row"}>
|
<Stack direction={"row"}>
|
||||||
<Typography variant="subtitle1">Bероятность перехода в критическое состояние: </Typography>
|
<Typography variant="subtitle1">Bероятность перехода в критическое состояние: </Typography>
|
||||||
<Typography variant="subtitle1" color={datails.breakDownColor}>
|
<Typography variant="subtitle1" color={details.breakDownColor}>
|
||||||
<b>{`${datails.breakDown}%*`}</b>
|
<b>{`${details.breakDown}%*`}</b>
|
||||||
</Typography>
|
</Typography>
|
||||||
</Stack>
|
</Stack>
|
||||||
<Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
|
<Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE}>
|
||||||
*до даты следующего ТО/ремонта по графику/ремонтной ведомости
|
*до даты следующего ТО/ремонта по графику/ремонтной ведомости
|
||||||
</Typography>
|
</Typography>
|
||||||
{chart.loaded ? <P8PChart {...chart} style={STYLES.TECH_OBJ_FORECAST_DETAIL_CHART} /> : null}
|
{chart.loaded && (
|
||||||
{!chart.available ? (
|
<>
|
||||||
|
<P8PChart {...chart} style={STYLES.TECH_OBJ_FORECAST_DETAIL_CHART} />
|
||||||
|
<Typography variant="caption" color={"text.secondary"} sx={STYLES.FORECAST_DETAIL_NOTE} pt={2}>
|
||||||
|
При расчёте вероятности принято, что она имеет равномерную функцию распределения на интервале [a, b],
|
||||||
|
<br />
|
||||||
|
гда a = 0 (текущий момент времени), b = количество дней до выхода из строя от текущего момента времени,
|
||||||
|
<br />
|
||||||
|
полученное от фреймворка прогнозирования
|
||||||
|
</Typography>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{!chart.available && (
|
||||||
<Box p={5}>
|
<Box p={5}>
|
||||||
<Paper elevation={6}>
|
<Paper elevation={6}>
|
||||||
<Box p={5}>
|
<Box p={5}>
|
||||||
@ -213,7 +245,7 @@ const ForecastDetail = ({ date, forecast, onClose }) => {
|
|||||||
</Box>
|
</Box>
|
||||||
</Paper>
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
) : null}
|
)}
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
<Button onClick={() => (onClose ? onClose() : null)}>{BUTTONS.CLOSE}</Button>
|
<Button onClick={() => (onClose ? onClose() : null)}>{BUTTONS.CLOSE}</Button>
|
||||||
@ -325,7 +357,7 @@ const TechObjCard = ({
|
|||||||
|
|
||||||
//При нажатии на отображение деталей прогноза
|
//При нажатии на отображение деталей прогноза
|
||||||
const handleShowForecastDetailClick = modelHist => {
|
const handleShowForecastDetailClick = modelHist => {
|
||||||
setState(pv => ({ ...pv, forecastDetail: modelHist.STO_FORECAST, forecastDate: modelHist.SRQ_DATE }));
|
setState(pv => ({ ...pv, forecastDetail: modelHist.STO_FORECAST_CARD, forecastDate: modelHist.SRQ_DATE }));
|
||||||
};
|
};
|
||||||
|
|
||||||
//При нажатии на закрытие деталей прогноза
|
//При нажатии на закрытие деталей прогноза
|
||||||
|
Loading…
x
Reference in New Issue
Block a user