Карточка тех. объекта: отображение даты следующего ТО, изменение графика ТО

This commit is contained in:
Mikhail Chechnev 2024-08-15 02:08:01 +03:00
parent b9a925d0d1
commit 2201fa4004
5 changed files with 352 additions and 23 deletions

View File

@ -22,6 +22,15 @@ create or replace package UDO_PKG_EQUIPTCF as
COUT out clob -- Сериализованная таблица данных COUT out clob -- Сериализованная таблица данных
); );
/* Выбор графиков технического обслуживания и ремонта технического объекта */
procedure EQCONFIG_THOBJ_SELECT_EQTCHSRV
(
NEQTCHSRV in number := null, -- Рег. номер графика ТО и ремонтов (null - любой)
NEQCONFIG in number := null, -- Рег. номер технического объекта (null - любой)
NSTATE in number := null, -- Состояние (null - любое)
NIDENT out number -- Идентификатор списка
);
/* Формирование карточки технического объекта */ /* Формирование карточки технического объекта */
procedure EQCONFIG_THOBJ_CARD procedure EQCONFIG_THOBJ_CARD
( (
@ -36,6 +45,14 @@ create or replace package UDO_PKG_EQUIPTCF as
NEQUIPDSCMML in number -- Рег. номер модели NEQUIPDSCMML in number -- Рег. номер модели
); );
/* Модификация графика ТО и ремонтов для технического объекта */
procedure EQCONFIG_THOBJ_CHNG_EQTCHSRV
(
NEQCONFIG in number, -- Рег. номер технического объекта
NEQTCHSRV in number, -- Рег. номер графика ТО и ремонтов
DPLANDATE_FROM in date -- Уточнённая плановая дата начала ремонта
);
/* Формирование ремонтной ведомости для технического объекта */ /* Формирование ремонтной ведомости для технического объекта */
procedure EQCONFIG_THOBJ_MAKE_EQRPSHEET procedure EQCONFIG_THOBJ_MAKE_EQRPSHEET
( (
@ -390,6 +407,57 @@ text="Проверка прав доступа при формировании
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end EQCONFIG_THOBJ_LIST; end EQCONFIG_THOBJ_LIST;
/* Получение даты следующего технического обслуживания технического объекта */
function EQCONFIG_THOBJ_GET_NXTEQTCHSRV
(
NEQCONFIG in number, -- Рег. номер технического объекта
NSTATE in number := null -- Состояние (null - любое)
) return date -- Дата следующего технического обслуживания
is
DRES PKG_STD.TLDATE; -- Буфер для результата
begin
/* Найдем график ТО и ремонтов, утвержденный, с минимальной датой по данному тех. объекту */
select min(T.DATEPRD_BEG)
into DRES
from EQTCHSRV T
where T.EQCONFIG_TECH = NEQCONFIG
and ((NSTATE is null) or ((NSTATE is not null) and (T.STATE = NSTATE)))
and T.DATEPRD_BEG >= sysdate;
/* Вернём результат */
return DRES;
exception
when others then
return null;
end EQCONFIG_THOBJ_GET_NXTEQTCHSRV;
/* Выбор графиков технического обслуживания и ремонта технического объекта */
procedure EQCONFIG_THOBJ_SELECT_EQTCHSRV
(
NEQTCHSRV in number := null, -- Рег. номер графика ТО и ремонтов (null - любой)
NEQCONFIG in number := null, -- Рег. номер технического объекта (null - любой)
NSTATE in number := null, -- Состояние (null - любое)
NIDENT out number -- Идентификатор списка
)
is
NTMP PKG_STD.TREF; -- Рег. номер записи буфера отобранных
begin
/* Обходим графики по тех. объекту */
for C in (select T.RN
from EQTCHSRV T
where ((NEQTCHSRV is null) or ((NEQTCHSRV is not null) and (T.RN = NEQTCHSRV)))
and ((NEQCONFIG is null) or ((NEQCONFIG is not null) and (T.EQCONFIG_TECH = NEQCONFIG)))
and ((NEQTCHSRV is not null) or ((NEQTCHSRV is null) and (T.DATEPRD_BEG >= sysdate)))
and ((NSTATE is null) or ((NSTATE is not null) and (T.STATE = NSTATE))))
loop
/* Формируем идентификатор списка если необходимо */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавляем отобранное в список */
P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => C.RN, SUNITCODE => 'EquipTechServices', NRN => NTMP);
end loop;
end EQCONFIG_THOBJ_SELECT_EQTCHSRV;
/* Формирование карточки технического объекта */ /* Формирование карточки технического объекта */
procedure EQCONFIG_THOBJ_CARD procedure EQCONFIG_THOBJ_CARD
( (
@ -431,6 +499,10 @@ text="Проверка прав доступа при формировании
SNAME => 'DOPER_DATE', SNAME => 'DOPER_DATE',
DVALUE => C.DOPER_DATE), DVALUE => C.DOPER_DATE),
RATTRIBUTE04 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR, RATTRIBUTE04 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
SNAME => 'DNEXT_EQTCHSRV',
SVALUE => TO_CHAR(EQCONFIG_THOBJ_GET_NXTEQTCHSRV(NEQCONFIG => C.NRN),
'dd.mm.yyyy hh24:mi:ss')),
RATTRIBUTE05 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
SNAME => 'SEQOBJKIND', SNAME => 'SEQOBJKIND',
SVALUE => C.SEQOBJKIND))); SVALUE => C.SEQOBJKIND)));
end loop; end loop;
@ -472,6 +544,79 @@ text="Проверка прав доступа при формировании
end loop; end loop;
end EQCONFIG_THOBJ_FORECAST; end EQCONFIG_THOBJ_FORECAST;
/* Модификация графика ТО и ремонтов для технического объекта */
procedure EQCONFIG_THOBJ_CHNG_EQTCHSRV
(
NEQCONFIG in number, -- Рег. номер технического объекта
NEQTCHSRV in number, -- Рег. номер графика ТО и ремонтов
DPLANDATE_FROM in date -- Уточнённая плановая дата начала ремонта
)
is
REQTCHSRV EQTCHSRV%rowtype; -- Запись графика ТО и ремонтов
RDSCMMLH UDO_T_EQUIPDSCMMLH%rowtype; -- Запись истории прогнозов
NDIFF PKG_STD.TNUMBER; -- Отклонение старой и новой дат
DDATEPRD_BEG PKG_STD.TLDATE; -- Новая дата начала
DDATEPRD_END PKG_STD.TLDATE; -- Новая дата окончания
SNOTE PKG_STD.TSTRING; -- Новое примечание
begin
/* Считаем график */
begin
select T.* into REQTCHSRV from EQTCHSRV T where T.RN = NEQTCHSRV;
exception
when NO_DATA_FOUND then
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NEQTCHSRV, SUNIT_TABLE => 'EquipTechServices');
end;
/* Считаем запись истории прогнозов */
begin
select T.*
into RDSCMMLH
from UDO_T_EQUIPDSCMMLH T
where T.RN = (select max(TT.RN) from UDO_T_EQUIPDSCMMLH TT where TT.EQCONFIG = NEQCONFIG);
exception
when others then
P_EXCEPTION(0,
'Не удалось определить запись-основание истории прогнозов модели.');
end;
/* Проверим, что из графика не сформирована ремонтная ведомость */
if (F_DOCLINKS_LINK_OUT_DOC(SIN_UNITCODE => 'EquipTechServices',
NIN_DOCUMENT => REQTCHSRV.RN,
SOUT_UNITCODE => 'EquipRepairSheets') is not null) then
P_EXCEPTION(0,
'Из графика ТО и ремонтов (RN: %s) уже создана ремонтная ведомость.',
TO_CHAR(REQTCHSRV.RN));
end if;
/* Проверим, что есть на что менять */
if (TRUNC(DPLANDATE_FROM) = TRUNC(REQTCHSRV.DATEPRD_BEG)) then
P_EXCEPTION(0,
'Выбранный график ТО и ремонтов уже запланирован на %s',
TO_CHAR(DPLANDATE_FROM, 'dd.mm.yyyy'));
end if;
/* Определим отклонение и новые даты графика */
NDIFF := DPLANDATE_FROM - REQTCHSRV.DATEPRD_BEG;
DDATEPRD_BEG := REQTCHSRV.DATEPRD_BEG + NDIFF;
DDATEPRD_END := REQTCHSRV.DATEPRD_END + NDIFF;
/* Формируем новое примечание */
SNOTE := 'Автоматически перенесён с "' || TO_CHAR(REQTCHSRV.DATEPRD_BEG, 'dd.mm.yyyy hh24:mi:ss') || '" на "' ||
TO_CHAR(DDATEPRD_BEG, 'dd.mm.yyyy hh24:mi:ss') || '" на основании прогноза от "' ||
TO_CHAR(RDSCMMLH.RQ_DATE, 'dd.mm.yyyy hh24:mi:ss') || '" (RN: ' || TO_CHAR(RDSCMMLH.RN) ||
', пользователь: ' || RDSCMMLH.RQ_AUTHID || ').';
/* Изменим заголовок графика */
update EQTCHSRV T
set T.DATEPRD_BEG = DDATEPRD_BEG,
T.DATEPRD_END = DDATEPRD_END,
T.NOTE = SNOTE
where T.RN = REQTCHSRV.RN;
/* Сдвинем работы */
P_EQTCHSRV_MOVE_WORK(NCOMPANY => REQTCHSRV.COMPANY,
NRN => REQTCHSRV.RN,
NDUP_RN => null,
DDATEPRD_BEG => DDATEPRD_BEG,
DOLD_DATEPRD_BEG => REQTCHSRV.DATEPRD_BEG,
DDATEPRD_END => DDATEPRD_END,
NPERIOD => null,
NMODE => 1);
end EQCONFIG_THOBJ_CHNG_EQTCHSRV;
/* Формирование ремонтной ведомости для технического объекта */ /* Формирование ремонтной ведомости для технического объекта */
procedure EQCONFIG_THOBJ_MAKE_EQRPSHEET procedure EQCONFIG_THOBJ_MAKE_EQRPSHEET
( (

View File

@ -240,7 +240,7 @@ const IUDFormTextField = ({ elementCode, elementValue, labelText, onChange, dict
//Контроль свойств - Поле ввода формы //Контроль свойств - Поле ввода формы
IUDFormTextField.propTypes = { IUDFormTextField.propTypes = {
elementCode: PropTypes.string.isRequired, elementCode: PropTypes.string.isRequired,
elementValue: PropTypes.string, elementValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.instanceOf(Date)]),
labelText: PropTypes.string.isRequired, labelText: PropTypes.string.isRequired,
onChange: PropTypes.func, onChange: PropTypes.func,
dictionary: PropTypes.func, dictionary: PropTypes.func,

View File

@ -21,6 +21,7 @@ import {
TechObjCard, TechObjCard,
eqConfigTechObjTableValueFormatter, eqConfigTechObjTableValueFormatter,
eqConfigTechObjTableDataCellRender, eqConfigTechObjTableDataCellRender,
TechObjChangeEqTchSrv,
TechObjMakeEqRpSheet, TechObjMakeEqRpSheet,
TechObjMakeDataSet TechObjMakeDataSet
} from "./forecast_tab_layout"; //Вспомогательные компоненты и вёрстка } from "./forecast_tab_layout"; //Вспомогательные компоненты и вёрстка
@ -40,15 +41,16 @@ import {
//Начальное состояние флагов обновления //Начальное состояние флагов обновления
const REFRESH_INITIAL = { const REFRESH_INITIAL = {
techObjSpec: 0, techObjSpec: 0,
techObjCard: 0,
techObjForecastHistList: 0 techObjForecastHistList: 0
}; };
//Начальное состояние диалогов //Начальное состояние диалогов
const DIALOGS_INITIAL = { makeEqRpSheet: false, makeEqDataSet: false, techObjCard: false }; const DIALOGS_INITIAL = { makeEqRpSheet: false, makeEqDataSet: false, techObjCard: false, changeEqTchSrv: false };
//Начальное состояние спецификации технических объектов //Начальное состояние спецификации технических объектов
const TECH_OBJ_SPEC_INITIAL = { const TECH_OBJ_SPEC_INITIAL = {
parent: null, parent: 8938140,
filters: [], filters: [],
orders: [], orders: [],
pageNumber: 1 pageNumber: 1
@ -120,7 +122,7 @@ const ForecastTab = ({ onGoToAdmin }) => {
); );
//Загрузчик карточки выбранного технического объекта //Загрузчик карточки выбранного технического объекта
const { techObjCard, techObjCardIsLoading } = useEqConfigTechObjCard(techObj.id); const { techObjCard } = useEqConfigTechObjCard(techObj.id, refresh.techObjCard);
//Загрузчик моделей выбранного технического объекта //Загрузчик моделей выбранного технического объекта
const { techObjModelsList } = useTechObjModelsList(techObj.id); const { techObjModelsList } = useTechObjModelsList(techObj.id);
@ -173,9 +175,15 @@ const ForecastTab = ({ onGoToAdmin }) => {
setTechObj(TECH_OBJ_INITIAL); setTechObj(TECH_OBJ_INITIAL);
}; };
//При нажатии на "Изменить график ТО" в карточке технического объекта
const handleTechObjeCardChangeEqTchSrv = () => setDialogs(pv => ({ ...pv, changeEqTchSrv: true }));
//При нажатии на "Ремонтировать" в карточке технического объекта //При нажатии на "Ремонтировать" в карточке технического объекта
const handleTechObjeCardMakeEqRpSheet = () => setDialogs(pv => ({ ...pv, makeEqRpSheet: true })); const handleTechObjeCardMakeEqRpSheet = () => setDialogs(pv => ({ ...pv, makeEqRpSheet: true }));
//При необходимости обновления карточки технического объекта
const handleCardDataRefresh = () => setRefresh(pv => ({ ...pv, techObjCard: pv.techObjCard + 1 }));
//При нажатии "ОК" в диалоге формирования ремонтной ведомости //При нажатии "ОК" в диалоге формирования ремонтной ведомости
const handleTechObjMakeEqRpSheetOk = async values => { const handleTechObjMakeEqRpSheetOk = async values => {
const data = await executeStored({ const data = await executeStored({
@ -194,6 +202,29 @@ const ForecastTab = ({ onGoToAdmin }) => {
//При нажитии "Отмена" в диалоге формирования ремонтной ведомости //При нажитии "Отмена" в диалоге формирования ремонтной ведомости
const handleTechObjMakeEqRpSheetCancel = () => setDialogs(pv => ({ ...pv, makeEqRpSheet: false })); const handleTechObjMakeEqRpSheetCancel = () => setDialogs(pv => ({ ...pv, makeEqRpSheet: false }));
//При нажатии "ОК" в диалоге корректировки графика ТО и ремонтов
const handleTechObjChangeEqTchSrvOk = async values => {
await executeStored({
stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_CHNG_EQTCHSRV",
args: {
NEQCONFIG: techObj.id,
NEQTCHSRV: values.eQTchSrv,
DPLANDATE_FROM: new Date(values.planDateFrom)
}
});
handleCardDataRefresh();
setDialogs(pv => ({ ...pv, changeEqTchSrv: false }));
const data = await executeStored({ stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_SELECT_EQTCHSRV", args: { NEQTCHSRV: values.eQTchSrv } });
if (data.NIDENT)
pOnlineShowUnit({
unitCode: "EquipTechServices",
inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }]
});
};
//При нажитии "Отмена" в диалоге корректировки графика ТО и ремонтов
const handleTechObjChangeEqTchSrvCancel = () => setDialogs(pv => ({ ...pv, changeEqTchSrv: false }));
//При нажатии "ОК" в диалоге формирования выборки данных //При нажатии "ОК" в диалоге формирования выборки данных
const handleTechObjMakeDataSetOk = async values => { const handleTechObjMakeDataSetOk = async values => {
const data = await executeStored({ const data = await executeStored({
@ -234,7 +265,7 @@ const ForecastTab = ({ onGoToAdmin }) => {
return ( return (
<div> <div>
{dialogs.techObjCard ? ( {dialogs.techObjCard ? (
techObj.id && !techObjCardIsLoading && techObjCard?.SCODE ? ( techObj.id && techObjCard?.SCODE ? (
<TechObjCard <TechObjCard
cardData={techObjCard} cardData={techObjCard}
modelsList={techObjModelsList} modelsList={techObjModelsList}
@ -242,7 +273,9 @@ const ForecastTab = ({ onGoToAdmin }) => {
onClose={handleTechObjeCardClose} onClose={handleTechObjeCardClose}
onGoToModel={handleTechObjeCardGoToModel} onGoToModel={handleTechObjeCardGoToModel}
onGetPrediction={handleTechObjeCardGetPrediction} onGetPrediction={handleTechObjeCardGetPrediction}
onChangeEqTchSrv={handleTechObjeCardChangeEqTchSrv}
onMakeEqRpSheet={handleTechObjeCardMakeEqRpSheet} onMakeEqRpSheet={handleTechObjeCardMakeEqRpSheet}
onCardDataRefresh={handleCardDataRefresh}
/> />
) : null ) : null
) : null} ) : null}
@ -255,6 +288,9 @@ const ForecastTab = ({ onGoToAdmin }) => {
onOk={handleTechObjMakeDataSetOk} onOk={handleTechObjMakeDataSetOk}
/> />
) : null} ) : null}
{dialogs.changeEqTchSrv ? (
<TechObjChangeEqTchSrv eQConfig={techObj.id} onCancel={handleTechObjChangeEqTchSrvCancel} onOk={handleTechObjChangeEqTchSrvOk} />
) : null}
<Grid container> <Grid container>
<Grid item xs={3} sx={STYLES.LEFT_SIDE_GRID}> <Grid item xs={3} sx={STYLES.LEFT_SIDE_GRID}>
<Box sx={STYLES.TREE_BOX}> <Box sx={STYLES.TREE_BOX}>

View File

@ -147,7 +147,7 @@ const useEqConfigTechObjTable = (parent, filters, orders, pageNumber, refresh) =
}; };
//Загрузка карточки технического объекта //Загрузка карточки технического объекта
const useEqConfigTechObjCard = id => { const useEqConfigTechObjCard = (id, refresh) => {
//Собственное состояние - флаг загрузки //Собственное состояние - флаг загрузки
const [isLoading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
@ -174,7 +174,7 @@ const useEqConfigTechObjCard = id => {
} }
}; };
if (id) loadData(); if (id) loadData();
}, [id, executeStored]); }, [id, refresh, executeStored]);
//Вернём данные //Вернём данные
return { techObjCard: card, techObjCardIsLoading: isLoading }; return { techObjCard: card, techObjCardIsLoading: isLoading };

View File

@ -12,7 +12,9 @@ import PropTypes from "prop-types"; //Контроль свойств компо
import { Stack, Card, CardContent, Typography, Button, 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 { useTheme } from "@mui/material/styles"; //Темы оформления
import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы и константы import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { BUTTONS, TEXTS } from "../../../app.text"; //Текстовые ресурсы и константы
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { formatDateRF, xml2JSON } from "../../core/utils"; //Вспомогательные функции import { formatDateRF, xml2JSON } from "../../core/utils"; //Вспомогательные функции
@ -189,7 +191,26 @@ const eqConfigTechObjTableDataCellRender = ({ row, columnDef, onCMMLStatus }) =>
}; };
//Карточка технического объекта //Карточка технического объекта
const TechObjCard = ({ cardData, modelsList, forecastHistList, onClose, onGoToModel, onGetPrediction, onMakeEqRpSheet }) => { const TechObjCard = ({
cardData,
modelsList,
forecastHistList,
onClose,
onGoToModel,
onGetPrediction,
onChangeEqTchSrv,
onMakeEqRpSheet,
onCardDataRefresh
}) => {
//Подключение к контексту приложения
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Подключение к контексту сообщений
const { showMsgErr } = useContext(MessagingСtx);
//Подключаемся к теме //Подключаемся к теме
const theme = useTheme(); const theme = useTheme();
@ -205,6 +226,9 @@ const TechObjCard = ({ cardData, modelsList, forecastHistList, onClose, onGoToMo
//При нажатии на запрос предсказания //При нажатии на запрос предсказания
const handleGetPredictionClick = model => (onGetPrediction ? onGetPrediction(model) : null); const handleGetPredictionClick = model => (onGetPrediction ? onGetPrediction(model) : null);
//При нажатии на изменение графика ТО и ремонтов
const handleChangeEqTchSrvClick = () => (onChangeEqTchSrv ? onChangeEqTchSrv() : null);
//При нажатии на формирование ремонтной ведомости //При нажатии на формирование ремонтной ведомости
const handleMakeEqRpSheetClick = () => (onMakeEqRpSheet ? onMakeEqRpSheet() : null); const handleMakeEqRpSheetClick = () => (onMakeEqRpSheet ? onMakeEqRpSheet() : null);
@ -216,6 +240,18 @@ const TechObjCard = ({ cardData, modelsList, forecastHistList, onClose, onGoToMo
//При нажатии на закрытие деталей прогноза //При нажатии на закрытие деталей прогноза
const handleCloseForecastDetailClick = () => setState(pv => ({ ...pv, forecastDetail: null, forecastDate: null })); const handleCloseForecastDetailClick = () => setState(pv => ({ ...pv, forecastDetail: null, forecastDate: null }));
//При нажатии на дату следующего обслуживания
const handleNextRepairClick = async () => {
const data = await executeStored({ stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_SELECT_EQTCHSRV", args: { NEQCONFIG: cardData.NRN } });
if (data.NIDENT)
pOnlineShowDictionary({
unitCode: "EquipTechServices",
inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }],
callBack: res => (res.success && onCardDataRefresh ? onCardDataRefresh() : null)
});
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
//Генерация содержимого //Генерация содержимого
return ( return (
<> <>
@ -227,9 +263,19 @@ const TechObjCard = ({ cardData, modelsList, forecastHistList, onClose, onGoToMo
<DialogContent sx={STYLES.TECH_OBJ_CARD_DIALOG_CONTENT}> <DialogContent sx={STYLES.TECH_OBJ_CARD_DIALOG_CONTENT}>
<Typography variant="h6">{cardData.SNAME}</Typography> <Typography variant="h6">{cardData.SNAME}</Typography>
<Stack spacing={2}> <Stack spacing={2}>
<Typography color="text.secondary" variant="caption" gutterBottom> <Stack>
{`${formatDateRF(cardData.DOPER_DATE)}, ${cardData.SEQOBJKIND}`} <Typography color="text.secondary" variant="caption">
</Typography> {`${formatDateRF(cardData.DOPER_DATE)}, ${cardData.SEQOBJKIND}`}
</Typography>
{cardData.DNEXT_EQTCHSRV ? (
<Typography color="text.secondary" variant="caption" gutterBottom>
Следующее ТО:{" "}
<Link component="button" variant="body2" align="left" underline="hover" onClick={handleNextRepairClick}>
{cardData.DNEXT_EQTCHSRV}
</Link>
</Typography>
) : null}
</Stack>
{modelsList.init ? ( {modelsList.init ? (
<Card elevation={6}> <Card elevation={6}>
<CardContent> <CardContent>
@ -287,6 +333,11 @@ const TechObjCard = ({ cardData, modelsList, forecastHistList, onClose, onGoToMo
</Stack> </Stack>
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
{cardData.DNEXT_EQTCHSRV ? (
<Button onClick={handleChangeEqTchSrvClick} color={"warning"}>
Изменить график ТО
</Button>
) : null}
<Button onClick={handleMakeEqRpSheetClick} color={"error"}> <Button onClick={handleMakeEqRpSheetClick} color={"error"}>
Ремонтировать Ремонтировать
</Button> </Button>
@ -305,7 +356,97 @@ TechObjCard.propTypes = {
onClose: PropTypes.func, onClose: PropTypes.func,
onGoToModel: PropTypes.func, onGoToModel: PropTypes.func,
onGetPrediction: PropTypes.func, onGetPrediction: PropTypes.func,
onMakeEqRpSheet: PropTypes.func onChangeEqTchSrv: PropTypes.func,
onMakeEqRpSheet: PropTypes.func,
onCardDataRefresh: PropTypes.func
};
//Диалог модификации гарфика ТО и ремонтов
const TechObjChangeEqTchSrv = ({ eQConfig, onOk, onCancel }) => {
//Подключение к контексту приложения
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Подключение к контексту сообщений
const { showMsgErr } = useContext(MessagingСtx);
//Собственное состояние - значения формы
const [values, setValues] = useState({
eQTchSrv: "",
eQTchSrvDesc: "",
planDateFrom: ""
});
//Отработка воода значения в форму
const handleValueChanged = (name, value) => setValues(pv => ({ ...pv, [name]: value }));
//Выбор графика ТО и ремонтов
const selectEquipTechService = async (name, callBack) => {
const data = await executeStored({ stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_SELECT_EQTCHSRV", args: { NEQCONFIG: eQConfig } });
if (data.NIDENT)
pOnlineShowDictionary({
unitCode: "EquipTechServices",
inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }],
callBack: res =>
callBack(
res.success
? [
{ name: "eQTchSrv", value: res.outParameters.out_RN },
{
name,
value: `${res.outParameters.out_DOCTYPES_DOCCODE}${String(res.outParameters.out_PREF).trim()}-${String(
res.outParameters.out_NUMB
).trim()} от ${formatDateRF(res.outParameters.out_DOCDATE)}`
}
]
: null
)
});
else showMsgErr(TEXTS.NO_DATA_FOUND);
};
//Генерация содержимого
return (
<Dialog open={true} onClose={() => (onOk ? onCancel() : null)}>
<DialogTitle>Корректировка графика ТО и ремонтов</DialogTitle>
<DialogContent>
<IUDFormTextField
elementCode={"eQTchSrvDesc"}
elementValue={values.eQTchSrvDesc}
labelText={"График ТО"}
onChange={handleValueChanged}
dictionary={callBack => selectEquipTechService("eQTchSrvDesc", callBack)}
/>
<IUDFormTextField
elementCode={"eQTchSrv"}
elementValue={values.eQTchSrv}
labelText={"График ТО (идентификатор)"}
onChange={handleValueChanged}
sx={{ display: "none" }}
/>
<IUDFormTextField
elementCode={"planDateFrom"}
elementValue={values.planDateFrom}
labelText={"Плановая дата ремонта"}
onChange={handleValueChanged}
type={"date"}
/>
</DialogContent>
<DialogActions>
<Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button>
<Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
</DialogActions>
</Dialog>
);
};
//Контроль свойств - Диалог модификации гарфика ТО и ремонтов
TechObjChangeEqTchSrv.propTypes = {
eQConfig: PropTypes.number.isRequired,
onOk: PropTypes.func,
onCancel: PropTypes.func
}; };
//Диалог формирования ремонтной ведомости //Диалог формирования ремонтной ведомости
@ -393,16 +534,16 @@ const TechObjMakeDataSet = ({ eqobjKind, measureUnit, onOk, onCancel }) => {
const [values, setValues] = useState({ const [values, setValues] = useState({
dataSet: "", dataSet: "",
eqobjKind: eqobjKind, eqobjKind: eqobjKind,
measureUnit: measureUnit || "", measureUnit: measureUnit || "СУТ",
userprocsData: "", userprocsData: "ФормДанВыгрОбучМод",
exsServiceUpload: "", exsServiceUpload: "Загрузкаа_SCP",
exsServiceFnUpload: "", exsServiceFnUpload: "Загрузкаа_SCP",
exsServiceSendMd: "", exsServiceSendMd: "Загрузкаареймворк",
exsServiceFnSendMd: "", exsServiceFnSendMd: "Передача данных",
exsServiceSendRq: "", exsServiceSendRq: "Загрузкаареймворк",
exsServiceFnSendRq: "", exsServiceFnSendRq: "Запрос на обучение",
task: "RUL", task: "RUL",
precisionP: null precisionP: 99
}); });
//Отработка воода значения в форму //Отработка воода значения в форму
@ -519,4 +660,11 @@ TechObjMakeDataSet.propTypes = {
//Интерфейс модуля //Интерфейс модуля
//---------------- //----------------
export { eqConfigTechObjTableValueFormatter, eqConfigTechObjTableDataCellRender, TechObjCard, TechObjMakeEqRpSheet, TechObjMakeDataSet }; export {
eqConfigTechObjTableValueFormatter,
eqConfigTechObjTableDataCellRender,
TechObjCard,
TechObjChangeEqTchSrv,
TechObjMakeEqRpSheet,
TechObjMakeDataSet
};