diff --git a/db/UDO_PKG_EQUIPDS_BASE.pck b/db/UDO_PKG_EQUIPDS_BASE.pck index cecc019..fed2c4c 100644 --- a/db/UDO_PKG_EQUIPDS_BASE.pck +++ b/db/UDO_PKG_EQUIPDS_BASE.pck @@ -351,6 +351,16 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as ) is begin + /* Удалим файлы */ + for C in (select T.RN from UDO_T_EQUIPDSCMFL T where T.PRN = NRN) + loop + CMFL_DEL(NRN => C.RN); + end loop; + /* Удалим модели */ + for C in (select T.RN from UDO_T_EQUIPDSCMML T where T.PRN = NRN) + loop + CMML_DEL(NRN => C.RN); + end loop; /* Удалим запись */ delete from UDO_T_EQUIPDSCM T where T.RN = NRN; end CM_DEL; @@ -457,9 +467,14 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as ) is begin + /* Удалим историю */ + for C in (select T.RN from UDO_T_EQUIPDSCMMLH T where T.PRN = NRN) + loop + CMMLH_DEL(NRN => C.RN); + end loop; /* Удалим запись */ delete from UDO_T_EQUIPDSCMML T where T.RN = NRN; - end CMML_DEL; + end CMML_DEL; /* Базовая установка фактической точности "Выборки данных оборудования (классы оборудования, модели)" */ procedure CMML_SET_PRECISION_F diff --git a/db/UDO_PKG_EQUIPTCF.pck b/db/UDO_PKG_EQUIPTCF.pck index 858f592..7deff7a 100644 --- a/db/UDO_PKG_EQUIPTCF.pck +++ b/db/UDO_PKG_EQUIPTCF.pck @@ -81,8 +81,7 @@ text="Проверка прав доступа при формировании else 0 end NHASCHILDREN, - M.OBJ_KIND NOBJ_KIND, - 0 NSHOW_CARD + M.OBJ_KIND NOBJ_KIND from EQCONFIG M, EQOBJLEVEL OL where M.PR_OBJ_LEVEL = OL.RN(+) @@ -105,29 +104,20 @@ text="Проверка прав доступа при формировании RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, SNAME => 'label', SVALUE => 'Минуточку...'))); - else - XCHILD := null; + /* Соберём лист */ + XLEAF := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, + SNAME => 'children', + RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, + RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'id', + SVALUE => C.NRN), + RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, + SNAME => 'label', + SVALUE => C.SNAME)), + RNODE00 => XCHILD); + /* Соберём листы в ветку */ + XRES := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XRES, RNODE01 => XLEAF); end if; - /* Для технического объекта, не имеющего дочерних - соберём признак отображения карточки */ - if ((C.NHASCHILDREN = 0) and (C.NOBJ_KIND is not null)) then - C.NSHOW_CARD := 1; - end if; - /* Соберём лист */ - XLEAF := PKG_XMAKE.ELEMENT(ICURSOR => NCUR, - SNAME => 'children', - RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR, - RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, - SNAME => 'id', - SVALUE => C.NRN), - RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, - SNAME => 'label', - SVALUE => C.SNAME), - RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, - SNAME => 'showCard', - NVALUE => C.NSHOW_CARD)), - RNODE00 => XCHILD); - /* Соберём листы в ветку */ - XRES := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XRES, RNODE01 => XLEAF); end loop; /* Вернём собранное */ return XRES; diff --git a/panels/eqs_tech_cond_forecast/admin_tab.js b/panels/eqs_tech_cond_forecast/admin_tab.js index 1e8192d..d62e05c 100644 --- a/panels/eqs_tech_cond_forecast/admin_tab.js +++ b/panels/eqs_tech_cond_forecast/admin_tab.js @@ -264,14 +264,16 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n - - add - - {equipDataSelection != DS_RN_DEFAULT ? ( - - delete + + + add - ) : null} + {equipDataSelection != DS_RN_DEFAULT ? ( + + delete + + ) : null} + diff --git a/panels/eqs_tech_cond_forecast/admin_tab_layout.js b/panels/eqs_tech_cond_forecast/admin_tab_layout.js index 0e40801..7bc7751 100644 --- a/panels/eqs_tech_cond_forecast/admin_tab_layout.js +++ b/panels/eqs_tech_cond_forecast/admin_tab_layout.js @@ -102,34 +102,6 @@ const STYLES = { //Вспомогательные функции и компоненты //------------------------------------ -//Кнопка с дополнительной подписью -const ExtraCaptionButton = ({ caption, title, subtitle, maxWidth, onClick, theme }) => { - //При нажатии на кнопку - const handleClick = () => (onClick ? onClick() : null); - - //Генерация содержимого - return ( - - - - {title} {subtitle} - - - ); -}; - -//Контроль свойств - Кнопка с дополнительной подписью -ExtraCaptionButton.propTypes = { - caption: PropTypes.string.isRequired, - title: PropTypes.string.isRequired, - subtitle: PropTypes.string.isRequired, - maxWidth: PropTypes.string, - onClick: PropTypes.func, - theme: PropTypes.object.isRequired -}; - //Формирование значения для колонки "Состояние" файла класса оборудования выборки данных const formatFileStateValue = (theme, value, err) => { const [text, icon, color] = @@ -166,7 +138,7 @@ const filesListDataCellRender = ({ row, columnDef, theme }) => { }; //Форматирование колонок таблицы моделей класса оборудования выборки данных -const modelsListDataCellRender = ({ row, columnDef, theme, card, onDelete, onSendRq }) => { +const modelsListDataCellRender = ({ row, columnDef, theme, onDelete, onSendRq }) => { switch (columnDef.name) { case "NSTATUS": return { @@ -180,16 +152,7 @@ const modelsListDataCellRender = ({ row, columnDef, theme, card, onDelete, onSen (onDelete ? onDelete(row.NRN) : null)}> delete - {row.NSTATUS == 0 ? ( - (onSendRq ? onSendRq(row.NRN) : null)} - theme={theme} - /> - ) : null} + {row.NSTATUS == 0 ? : null} ) }; @@ -541,30 +504,11 @@ const EquipDataSelectionClassMachineCard = ({ Файлы данных - - - + + + + + { //Подключение к контексту приложения const { pOnlineShowUnit } = useContext(ApplicationСtx); - //Подключение к API дерева - const apiRef = useTreeViewApiRef(); - //Собственное состояние - текущая загружаемая ветка const [loadingTreeItem, setLoadingTreeItem] = useState(0); @@ -122,14 +117,7 @@ const ForecastTab = ({ onGoToAdmin }) => { isExpanded && needLoadLevel(eQconfigTree, itemId) ? setLoadingTreeItem(parseInt(itemId)) : null; //Обработка фокусировки на элементе дерева - const handleTreeItemFocus = (event, itemId) => { - const item = findTreeItem(eQconfigTree, itemId); - if (item && item?.showCard) setTechObjCardId(parseInt(itemId)); - else { - setTechObjCardId(null); - setTechObjSpec({ ...TECH_OBJ_SPEC_INIT, parent: parseInt(itemId) }); - } - }; + const handleTreeItemFocus = (event, itemId) => setTechObjSpec({ ...TECH_OBJ_SPEC_INIT, parent: parseInt(itemId) }); //При изменении состояния фильтров спецификации технических объектов const handleTechObjSpecFilterChanged = ({ filters }) => setTechObjSpec(pv => ({ ...pv, filters: [...filters], pageNumber: 1 })); @@ -144,15 +132,14 @@ const ForecastTab = ({ onGoToAdmin }) => { const handleCMMLStatusClick = (event, row) => { if (row.NCMML_STATUS == 0) { if (onGoToAdmin) onGoToAdmin(); - } else { - const item = findTreeItem(eQconfigTree, row.NRN); - if (item && item?.showCard) apiRef.current?.focusItem(event, item.id); - else setTechObjCardId(parseInt(row.NRN)); - } + } else setTechObjCardId(parseInt(row.NRN)); }; //При переходе к закладке администрирования из карточки технического объекта - const handleTechObjeCardGoToModel = model => (onGoToAdmin ? onGoToAdmin(model.NEQUIPDS, model.NEQUIPDSCM) : null); + const handleTechObjeCardGoToModel = model => { + handleTechObjeCardClose(); + if (onGoToAdmin) onGoToAdmin(model.NEQUIPDS, model.NEQUIPDSCM); + }; //При запросе прогноза по модели из карточки технического объекта const handleTechObjeCardGetPrediction = async model => { @@ -199,28 +186,22 @@ const ForecastTab = ({ onGoToAdmin }) => { - + - {techObjCardId ? ( - !techObjCardIsLoading ? ( - - ) : null - ) : techObjsDataGrid.init ? ( + {techObjCardId && !techObjCardIsLoading && techObjCard?.SCODE ? ( + + ) : null} + {techObjsDataGrid.init ? ( { setLoading(true); const data = await executeStored({ stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_CARD", - args: { - NEQCONFIG: id - }, + args: { NEQCONFIG: id }, respArg: "COUT", - loader: false + loader: true }); setCard(data.techObj ? data.techObj : {}); } finally { diff --git a/panels/eqs_tech_cond_forecast/forecast_tab_layout.js b/panels/eqs_tech_cond_forecast/forecast_tab_layout.js index f8022d8..a3d1fef 100644 --- a/panels/eqs_tech_cond_forecast/forecast_tab_layout.js +++ b/panels/eqs_tech_cond_forecast/forecast_tab_layout.js @@ -9,23 +9,7 @@ import React, { useState, useEffect, useContext } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента -import { - Stack, - Icon, - Box, - Card, - CardContent, - Typography, - CardActions, - Button, - IconButton, - Divider, - Link, - Dialog, - DialogTitle, - DialogContent, - DialogActions -} from "@mui/material"; //Интерфейсные компоненты +import { Stack, Card, CardContent, Typography, Button, Link, Dialog, DialogTitle, DialogContent, DialogActions } from "@mui/material"; //Интерфейсные компоненты import { useTheme } from "@mui/material/styles"; //Темы оформления import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы и константы @@ -41,18 +25,17 @@ import { P8PChart } from "../../components/p8p_chart"; //График //Стили const STYLES = { - TECH_OBJ_CARD_TITLE: { fontSize: 14 }, - TECH_OBJ_CARD_SUB_TITLE: { mb: 1.5 }, - EQ_ML_TABLE: { - maxHeight: "200px", + TECH_OBJ_CARD_DIALOG: { maxWidth: "800px" }, + TECH_OBJ_CARD_ML_TABLE: { + maxHeight: "300px", ...SCROLL_STYLES }, - EQ_FORECAST_TABLE: { - maxHeight: "200px", + TECH_OBJ_CARD_FORECAST_TABLE: { + maxHeight: "300px", ...SCROLL_STYLES }, - EQ_FORECAST_DETAIL_DIALOG: { maxWidth: "600px" }, - EQ_FORECAST_DETAIL_CHART: { width: "550px", display: "flex", justifyContent: "center" } + TECH_OBJ_FORECAST_DETAIL_DIALOG: { maxWidth: "600px" }, + TECH_OBJ_FORECAST_DETAIL_CHART: { width: "550px", display: "flex", justifyContent: "center" } }; //------------------------------------ @@ -139,9 +122,9 @@ const ForecastDetail = ({ date, forecast, onClose }) => { //Генерация содержимого return ( - (onClose ? onClose() : null)} {...STYLES.EQ_FORECAST_DETAIL_DIALOG}> + (onClose ? onClose() : null)} {...STYLES.TECH_OBJ_FORECAST_DETAIL_DIALOG}> {`Детали прогноза от ${date}`} - {chart.loaded ? : null} + {chart.loaded ? : null} @@ -190,88 +173,82 @@ const TechObjCard = ({ cardData, modelsList, forecastHistList, onClose, onGoToMo //Генерация содержимого return ( - + <> {state.forecastDetail ? ( ) : null} - - - - - close - - - Технический объект - - - - {cardData.SCODE} - - - {`Введён в эксплуатацию: ${formatDateRF(cardData.DOPER_DATE)}`} -
- {`Класс: ${cardData.SEQOBJKIND}`} -
+ + {cardData.SCODE} + {cardData.SNAME} -
- {modelsList.init ? ( - <> - - - Модели - - - techObjCardModelsTableDataCellRender({ - ...prms, - theme, - onGoToModel: handleGoToModelClick, - onGetPrediction: handleGetPredictionClick - }) - } - /> - - ) : null} - {forecastHistList.init ? ( - <> - - - Прогнозы - - - techObjCardForecastListTableDataCellRender({ - ...prms, - theme, - onShowForecastDetail: handleShowForecastDetailClick - }) - } - /> - - ) : null} -
- - - -
-
+ + + {`${formatDateRF(cardData.DOPER_DATE)}, ${cardData.SEQOBJKIND}`} + + {modelsList.init ? ( + + + + Модели + + + techObjCardModelsTableDataCellRender({ + ...prms, + theme, + onGoToModel: handleGoToModelClick, + onGetPrediction: handleGetPredictionClick + }) + } + /> + + + ) : null} + {forecastHistList.init ? ( + + + + Прогнозы + + + techObjCardForecastListTableDataCellRender({ + ...prms, + theme, + onShowForecastDetail: handleShowForecastDetailClick + }) + } + /> + + + ) : null} + + + + + + +
+ ); };