diff --git a/db/UDO_PKG_EQUIPTCF.pck b/db/UDO_PKG_EQUIPTCF.pck index bb6c437..f572a26 100644 --- a/db/UDO_PKG_EQUIPTCF.pck +++ b/db/UDO_PKG_EQUIPTCF.pck @@ -158,6 +158,22 @@ text="Проверка прав доступа при формировании PKG_COND_BROKER.ADD_CONDITION_BETWEEN(SCOLUMN_NAME => 'OPER_DATE', SCONDITION_NAME_FROM => 'DOPER_DATEFrom', SCONDITION_NAME_TO => 'DOPER_DATETo'); + /* Состояние */ + PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE', + SCONDITION_NAME => 'SUSE_KINDFrom', + SJOINS => 'HLSTATETYPES <- RN;HLSTATETYPES'); + /* Класс */ + PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'NAME', + SCONDITION_NAME => 'SOBJ_KINDFrom', + SJOINS => 'OBJ_KIND <- RN;EQOBJKIND'); + /* Модели прогнозирования */ + if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'SEQUIPDSCMMLFrom') = 1) then + PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'UPPER(' || + PKG_SQL_BUILD.PKG_NAME(SNAME => 'UDO_PKG_EQUIPDS.CMML_LIST_BY_EQCONFIG') || + '(RN)) like REPLACE(REPLACE(UPPER(:SEQUIPDSCMML), ''?'', ''_''), ''*'', ''%'')'); + PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'SEQUIPDSCMML', + SVALUE => PKG_COND_BROKER.GET_CONDITION_STR(SCONDITION_NAME => 'SEQUIPDSCMMLFrom')); + end if; end EQCONFIG_THOBJ_LIST_COND; /* Формирование списка технических объектов для выбранного узла состава оборудования */ @@ -203,19 +219,27 @@ text="Проверка прав доступа при формировании PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SCODE', SCAPTION => 'Обозначение', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true, + BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SNAME', SCAPTION => 'Наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true, + BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'DOPER_DATE', SCAPTION => 'Дата ввода в эксплуатацию', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE); + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true, + BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SUSE_KIND', SCAPTION => 'Состояние', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true, + BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NOBJ_KIND', SCAPTION => 'Рег. номер класса технического объекта', @@ -224,11 +248,19 @@ text="Проверка прав доступа при формировании PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SOBJ_KIND', SCAPTION => 'Класс', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true, + BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SEQUIPDSCMML', SCAPTION => 'Модели прогнозирования', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SHINT => 'Модели прогнозирования - доступные для использования модели прогнозирования и задачи, ими решаемые:
' || + 'TCF - Оценка технического состояния (Technical Condition Forecast)
' || + 'RUL - Прогнозирование остаточного ресурса (Remaining Useful Life)
' || + 'FP - Прогнозирование отказа (Failure Predict)', + BORDER => true, + BFILTER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NEQUIPDSCMML_ACTION', SCAPTION => 'Действия с моделью', @@ -248,7 +280,7 @@ text="Проверка прав доступа при формировании PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.OPER_DATE DOPER_DATE,'); 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.CODE SOBJ_KIND,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' OK.NAME SOBJ_KIND,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'UDO_PKG_EQUIPDS.CMML_LIST_BY_EQCONFIG') || '(C.RN) SEQUIPDSCMML,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'UDO_PKG_EQUIPDS.CMML_ACT_BY_EQCONFIG') || '(C.RN) NEQUIPDSCMML_ACTION'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from EQCONFIG C'); diff --git a/panels/eqs_tech_cond_forecast/forecast_tab.js b/panels/eqs_tech_cond_forecast/forecast_tab.js index ac92e4c..672d6f2 100644 --- a/panels/eqs_tech_cond_forecast/forecast_tab.js +++ b/panels/eqs_tech_cond_forecast/forecast_tab.js @@ -7,13 +7,14 @@ //Подключение библиотек //--------------------- -import React, { useState } from "react"; //Классы React +import React, { useState, useContext } from "react"; //Классы React import { Box, Grid } from "@mui/material"; //Интерфейсные компоненты import { RichTreeView } from "@mui/x-tree-view/RichTreeView"; //Дерево +import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { useEqConfigTree, useEqConfigTechObjTable, useEqConfigTechObjCard, findTreeItem, needLoadLevel } from "./forecast_tab_hooks"; //Вспомогательные хуки -import { TechObjCard } from "./forecast_tab_layout"; //Вспомогательные компоненты и вёрстка +import { TechObjCard, eqConfigTechObjTableValueFormatter } from "./forecast_tab_layout"; //Вспомогательные компоненты и вёрстка //--------- //Константы @@ -28,6 +29,9 @@ const TABS_HEIGHT = "49px"; //Высота кнопки "Ещё" const TABLE_MORE_HEIGHT = "49px"; +//Высота фильтров таблицы +const TABLE_FILTERS_HEIGHT = "48px"; + //Стили const STYLES = { LEFT_SIDE_GRID: {}, @@ -37,13 +41,19 @@ const STYLES = { maxHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT})`, overflowX: "hidden", overflowY: "scroll", - scrollbarWidth: "thin" + scrollbarWidth: "thin", + padding: "3px" }, - TECH_OBJ_TABLE: morePages => ({ height: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT} - ${morePages ? TABLE_MORE_HEIGHT : "0px"})` }) + TECH_OBJ_TABLE: (morePages, filters) => ({ + height: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT} - ${morePages ? TABLE_MORE_HEIGHT : "0px"} - ${ + filters ? TABLE_FILTERS_HEIGHT : "0px" + })`, + scrollbarWidth: "thin" + }) }; //Начальное состояние спецификации техничких объектов -const TECH_OBJ_SPEC_INIT = { parent: null, filters: null, orders: null, pageNumber: 1 }; +const TECH_OBJ_SPEC_INIT = { parent: null, filters: [], orders: [], pageNumber: 1 }; //----------- //Тело модуля @@ -51,6 +61,9 @@ const TECH_OBJ_SPEC_INIT = { parent: null, filters: null, orders: null, pageNumb //Закладка прогнозирования const ForecastTab = () => { + //Подключение к контексту сообщений + const { InlineMsgInfo } = useContext(MessagingСtx); + //Собственное состояние - текущая загружаемая ветка const [loadingTreeItem, setLoadingTreeItem] = useState(0); @@ -97,41 +110,50 @@ const ForecastTab = () => { //При изменении количества отображаемых страниц спецификации технических объектов const handleTechObjSpecPagesCountChanged = () => setTechObjSpec(pv => ({ ...pv, pageNumber: pv.pageNumber + 1 })); + //Текст при отсутствии данных в списке технических объектов + const noDataFoundText = + techObjsDataGridIsLoading || !techObjsDataGrid.init + ? "Минуточку..." + : techObjSpec.filters.length > 0 + ? "Нет данных, соответствующих условиям отбора" + : "Выбранный уровень структуры не содержит данных о технических объектах"; + //Генерация содержимого return (
- + - + {techObjCardId ? ( !techObjCardIsLoading ? ( ) : null ) : techObjsDataGrid.init ? ( 0), + elevation: 0 }} - containerComponentProps={{ sx: STYLES.TECH_OBJ_TABLE(techObjsDataGrid.morePages), elevation: 0 }} + filtersInitial={techObjSpec.filters} columnsDef={techObjsDataGrid.columnsDef} rows={techObjsDataGrid.rows} size={P8P_DATA_GRID_SIZE.SMALL} morePages={techObjsDataGrid.morePages} fixedHeader={true} reloading={false} + valueFormatter={eqConfigTechObjTableValueFormatter} onFilterChanged={handleTechObjSpecFilterChanged} onOrderChanged={handleTechObjSpecOrderChanged} onPagesCountChanged={handleTechObjSpecPagesCountChanged} /> - ) : null} + ) : ( + + )}
diff --git a/panels/eqs_tech_cond_forecast/forecast_tab_hooks.js b/panels/eqs_tech_cond_forecast/forecast_tab_hooks.js index 632f52b..fe5ba33 100644 --- a/panels/eqs_tech_cond_forecast/forecast_tab_hooks.js +++ b/panels/eqs_tech_cond_forecast/forecast_tab_hooks.js @@ -16,7 +16,7 @@ import { deepCopyObject, object2Base64XML } from "../../core/utils"; //Вспо //--------- //Размер страницы данных -const DATA_GRID_PAGE_SIZE = 5; +const DATA_GRID_PAGE_SIZE = 50; //----------------------- //Вспомогательные функции diff --git a/panels/eqs_tech_cond_forecast/forecast_tab_layout.js b/panels/eqs_tech_cond_forecast/forecast_tab_layout.js index 72e0748..f80149d 100644 --- a/panels/eqs_tech_cond_forecast/forecast_tab_layout.js +++ b/panels/eqs_tech_cond_forecast/forecast_tab_layout.js @@ -8,7 +8,9 @@ //--------------------- import React from "react"; //Классы React +import PropTypes from "prop-types"; //Контроль свойств компонента import { Box, Card, CardContent, Typography, CardActions, Button } from "@mui/material"; //Интерфейсные компоненты +import { formatDateRF } from "../../core/utils"; //Вспомогательные функции //----------- //Тело модуля @@ -42,8 +44,22 @@ const TechObjCard = ({ cardData }) => { ); }; +//Контроль свойств - Карточка технического объекта +TechObjCard.propTypes = { + cardData: PropTypes.object +}; + +//Форматирование значений колонок таблицы технических объектов +const eqConfigTechObjTableValueFormatter = ({ value, columnDef }) => { + switch (columnDef.name) { + case "DOPER_DATE": + return formatDateRF(value); + } + return value; +}; + //---------------- //Интерфейс модуля //---------------- -export { TechObjCard }; +export { TechObjCard, eqConfigTechObjTableValueFormatter };