Общая структура компонентов панели "Прогноз технического состояния", дерево технических объектов
This commit is contained in:
parent
9594189131
commit
d76fa0fbd2
BIN
panels/eqs_tech_cond_forecast.jpg
Normal file
BIN
panels/eqs_tech_cond_forecast.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 53 KiB |
35
panels/eqs_tech_cond_forecast/admin_tab.js
Normal file
35
panels/eqs_tech_cond_forecast/admin_tab.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
Парус 8 - Панели мониторинга - ТОиР - Прогнозирование технического состояния
|
||||||
|
Закладка администрирования
|
||||||
|
*/
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
//Подключение библиотек
|
||||||
|
//---------------------
|
||||||
|
|
||||||
|
import React from "react"; //Классы React
|
||||||
|
import { Grid } from "@mui/material"; //Интерфейсные компоненты
|
||||||
|
|
||||||
|
//-----------
|
||||||
|
//Тело модуля
|
||||||
|
//-----------
|
||||||
|
|
||||||
|
//Закладка администрирования
|
||||||
|
const AdminTab = () => {
|
||||||
|
//Генерация содержимого
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Grid container>
|
||||||
|
<Grid item xs={12} sx={{ backgroundColor: "magenta" }}>
|
||||||
|
Здесь только администраторы могут работать
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------
|
||||||
|
//Интерфейс модуля
|
||||||
|
//----------------
|
||||||
|
|
||||||
|
export { AdminTab };
|
67
panels/eqs_tech_cond_forecast/eqs_tech_cond_forecast.js
Normal file
67
panels/eqs_tech_cond_forecast/eqs_tech_cond_forecast.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
Парус 8 - Панели мониторинга - ТОиР - Прогнозирование технического состояния
|
||||||
|
Панель мониторинга: Корневая панель прогнозирования технического состояния
|
||||||
|
*/
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
//Подключение библиотек
|
||||||
|
//---------------------
|
||||||
|
|
||||||
|
import React, { useState, useEffect } from "react"; //Классы React
|
||||||
|
import { Box, Tabs, Tab } from "@mui/material"; //Интерфейсные компоненты
|
||||||
|
import { AdminTab } from "./admin_tab"; //Интерфейс администрирования
|
||||||
|
import { ForecastTab } from "./forecast_tab"; //Интерфейс прогнозирования
|
||||||
|
|
||||||
|
//---------
|
||||||
|
//Константы
|
||||||
|
//---------
|
||||||
|
|
||||||
|
//Режимы работы панели
|
||||||
|
const MODES = {
|
||||||
|
FORECAST: 1,
|
||||||
|
ADMIN: 2
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------
|
||||||
|
//Тело модуля
|
||||||
|
//-----------
|
||||||
|
|
||||||
|
//Закладка
|
||||||
|
const TapPanel = ({ children }) => <Box>{children}</Box>;
|
||||||
|
|
||||||
|
//Корневая панель прогнозирования технического состояния
|
||||||
|
const EqsTechCondForecast = () => {
|
||||||
|
//Собственное состояние
|
||||||
|
const [mode, setMode] = useState(MODES.FORECAST);
|
||||||
|
|
||||||
|
//При переключении закладки
|
||||||
|
const handleTabChange = (e, newValue) => setMode(newValue);
|
||||||
|
|
||||||
|
//Генерация содержимого
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Box sx={{ borderBottom: 1, borderColor: "divider" }}>
|
||||||
|
<Tabs value={mode} onChange={handleTabChange}>
|
||||||
|
<Tab label="Прогноз" value={MODES.FORECAST} />
|
||||||
|
<Tab label="Обучение" value={MODES.ADMIN} />
|
||||||
|
</Tabs>
|
||||||
|
</Box>
|
||||||
|
{mode == MODES.ADMIN ? (
|
||||||
|
<TapPanel>
|
||||||
|
<AdminTab />{" "}
|
||||||
|
</TapPanel>
|
||||||
|
) : null}
|
||||||
|
{mode == MODES.FORECAST ? (
|
||||||
|
<TapPanel>
|
||||||
|
<ForecastTab />
|
||||||
|
</TapPanel>
|
||||||
|
) : null}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------
|
||||||
|
//Интерфейс модуля
|
||||||
|
//----------------
|
||||||
|
|
||||||
|
export { EqsTechCondForecast };
|
80
panels/eqs_tech_cond_forecast/forecast_tab.js
Normal file
80
panels/eqs_tech_cond_forecast/forecast_tab.js
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
Парус 8 - Панели мониторинга - ТОиР - Прогнозирование технического состояния
|
||||||
|
Закладка прогнозирования
|
||||||
|
*/
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
//Подключение библиотек
|
||||||
|
//---------------------
|
||||||
|
|
||||||
|
import React, { useState } from "react"; //Классы React
|
||||||
|
import { Box, Grid } from "@mui/material"; //Интерфейсные компоненты
|
||||||
|
import { RichTreeView } from "@mui/x-tree-view/RichTreeView"; //Дерево
|
||||||
|
import { useEqConfigTree, needLoadLevel } from "./forecast_tab_hooks"; //Вспомогательные хуки
|
||||||
|
|
||||||
|
//---------
|
||||||
|
//Константы
|
||||||
|
//---------
|
||||||
|
|
||||||
|
//Высота главного меню
|
||||||
|
const APP_BAR_HEIGHT = "64px";
|
||||||
|
|
||||||
|
//Высота закладок
|
||||||
|
const TABS_HEIGHT = "49px";
|
||||||
|
|
||||||
|
//Стили
|
||||||
|
const STYLES = {
|
||||||
|
LEFT_SIDE_GRID: { backgroundColor: "red" },
|
||||||
|
RIGHT_SIDE_GRID: { backgroundColor: "green" },
|
||||||
|
TREE_BOX: {
|
||||||
|
minHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT})`,
|
||||||
|
maxHeight: `calc(100vh - ${APP_BAR_HEIGHT} - ${TABS_HEIGHT})`,
|
||||||
|
backgroundColor: "yellow",
|
||||||
|
overflowX: "hidden",
|
||||||
|
overflowY: "auto",
|
||||||
|
scrollbarWidth: "thin",
|
||||||
|
scrollbarColor: "red blue"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------
|
||||||
|
//Тело модуля
|
||||||
|
//-----------
|
||||||
|
|
||||||
|
//Закладка прогнозирования
|
||||||
|
const ForecastTab = () => {
|
||||||
|
//Собственное состояние - текущая загружаемая ветка
|
||||||
|
const [loadingTreeItem, setLoadingTreeItem] = useState(0);
|
||||||
|
|
||||||
|
//Загрузчик веток дерева
|
||||||
|
const { tree } = useEqConfigTree(loadingTreeItem);
|
||||||
|
|
||||||
|
//Обработка развёртывания/свёртывания уровня дерева
|
||||||
|
const handleTreeItemExpansionToggle = (event, itemId, isExpanded) =>
|
||||||
|
isExpanded && needLoadLevel(tree, itemId) ? setLoadingTreeItem(parseInt(itemId)) : null;
|
||||||
|
|
||||||
|
//Обработка фокусировки на элементе дерева
|
||||||
|
const handleTreeItemFocus = (event, itemId, isExpanded) => console.log(event, itemId, isExpanded);
|
||||||
|
|
||||||
|
//Генерация содержимого
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Grid container>
|
||||||
|
<Grid item xs={4} sx={STYLES.LEFT_SIDE_GRID}>
|
||||||
|
<Box sx={STYLES.TREE_BOX}>
|
||||||
|
<RichTreeView items={tree} onItemExpansionToggle={handleTreeItemExpansionToggle} onItemFocus={handleTreeItemFocus} />
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
<Grid item xs={8} sx={STYLES.RIGHT_SIDE_GRID}>
|
||||||
|
ОБОРУДОВАНИЕ
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------
|
||||||
|
//Интерфейс модуля
|
||||||
|
//----------------
|
||||||
|
|
||||||
|
export { ForecastTab };
|
96
panels/eqs_tech_cond_forecast/forecast_tab_hooks.js
Normal file
96
panels/eqs_tech_cond_forecast/forecast_tab_hooks.js
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
Парус 8 - Панели мониторинга - ТОиР - Прогнозирование технического состояния
|
||||||
|
Кастомные хуки закладки Прогнозирования
|
||||||
|
*/
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
//Подключение библиотек
|
||||||
|
//---------------------
|
||||||
|
|
||||||
|
import { useState, useEffect, useContext } from "react"; //Классы React
|
||||||
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
import { deepCopyObject } from "../../core/utils"; //Утилиты
|
||||||
|
|
||||||
|
//-----------------------
|
||||||
|
//Вспомогательные функции
|
||||||
|
//-----------------------
|
||||||
|
|
||||||
|
//Проверка необходимости загрузки уровня для указанного родителя
|
||||||
|
const needLoadLevel = (tree, parent) => {
|
||||||
|
let res = false;
|
||||||
|
tree.forEach(treeItem => {
|
||||||
|
if (treeItem.id == parent) {
|
||||||
|
if (treeItem.children && treeItem.children.length == 1 && treeItem.children[0].id.endsWith("loader")) res = true;
|
||||||
|
}
|
||||||
|
if (treeItem.children && treeItem.children.length > 0 && !treeItem.children[0].id.endsWith("loader"))
|
||||||
|
res = needLoadLevel(treeItem.children, parent);
|
||||||
|
});
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Встраивание уровня в указанного родителя
|
||||||
|
const appendLevel = (tree, parent, children) => {
|
||||||
|
tree.forEach(treeItem => {
|
||||||
|
if (treeItem.id == parent) {
|
||||||
|
treeItem.children = children;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (treeItem.children && treeItem.children.length > 0 && !treeItem.children[0].id.endsWith("loader"))
|
||||||
|
appendLevel(treeItem.children, parent, children);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------
|
||||||
|
//Тело модуля
|
||||||
|
//-----------
|
||||||
|
|
||||||
|
//Загрузка ветки дерева состава оборудования
|
||||||
|
const useEqConfigTree = parent => {
|
||||||
|
//Собственное состояние - флаг загрузки
|
||||||
|
const [isLoading, setLoading] = useState(false);
|
||||||
|
|
||||||
|
//Собственное состояние - данные дерева
|
||||||
|
const [tree, setTree] = useState([]);
|
||||||
|
|
||||||
|
//Подключение к контексту взаимодействия с сервером
|
||||||
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
|
//Загрузка данных при изменении зависимостей
|
||||||
|
useEffect(() => {
|
||||||
|
const loadData = async () => {
|
||||||
|
try {
|
||||||
|
setLoading(true);
|
||||||
|
const data = await executeStored({
|
||||||
|
stored: "UDO_PKG_EQUIPTCF.EQCONFIG_HIER",
|
||||||
|
args: {
|
||||||
|
NPEQCONFIG: parent
|
||||||
|
},
|
||||||
|
respArg: "COUT",
|
||||||
|
isArray: name => ["children"].includes(name),
|
||||||
|
attributeValueProcessor: (name, val) => (["id"].includes(name) ? undefined : val),
|
||||||
|
loader: false
|
||||||
|
});
|
||||||
|
setTree(prevTree => {
|
||||||
|
if (prevTree.length == 0) return data.children;
|
||||||
|
else {
|
||||||
|
let newTree = deepCopyObject(prevTree);
|
||||||
|
appendLevel(newTree, parent, data.children);
|
||||||
|
return newTree;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (parent == 0 || parent) loadData();
|
||||||
|
}, [parent, executeStored]);
|
||||||
|
|
||||||
|
//Вернём данные
|
||||||
|
return { tree, isLoading };
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------
|
||||||
|
//Интерфейс модуля
|
||||||
|
//----------------
|
||||||
|
|
||||||
|
export { useEqConfigTree, needLoadLevel };
|
16
panels/eqs_tech_cond_forecast/index.js
Normal file
16
panels/eqs_tech_cond_forecast/index.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
Парус 8 - Панели мониторинга - ТОиР - Прогнозирование технического состояния
|
||||||
|
Панель мониторинга: Точка входа
|
||||||
|
*/
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
//Подключение библиотек
|
||||||
|
//---------------------
|
||||||
|
|
||||||
|
import { EqsTechCondForecast } from "./eqs_tech_cond_forecast"; //Корневая панель прогнозирования технического состояния
|
||||||
|
|
||||||
|
//----------------
|
||||||
|
//Интерфейс модуля
|
||||||
|
//----------------
|
||||||
|
|
||||||
|
export const RootClass = EqsTechCondForecast;
|
Loading…
x
Reference in New Issue
Block a user