/* Парус 8 - Панели мониторинга - ТОиР - Выполнение работ Панель мониторинга: Корневая панель выполнения работ */ //--------------------- //Подключение библиотек //--------------------- import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React import { Grid, Paper, Box, Link, Button, Dialog, DialogActions, DialogContent, DialogTitle, InputLabel, FormControl, OutlinedInput, InputAdornment, IconButton, Icon, Select, MenuItem, FormHelperText } from "@mui/material"; import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { headCellRender, dataCellRender, groupCellRender, DIGITS_REG_EXP, MONTH_NAME_REG_EXP, DAY_NAME_REG_EXP } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы //----------- //Тело модуля //----------- //Корневая панель выполнения работ const EqsPrfrm = () => { //Собственное состояние - таблица данных const [dataGrid, setDataGrid] = useState({ dataLoaded: false, columnsDef: [], groups: [], rows: [], reload: false }); // Состояние фильтра const [filter, setFilter] = useState({ belong: "", prodObj: "", techServ: "", respDep: "", fromMonth: 1, fromYear: 1990, toMonth: 1, toYear: 1990 }); // Состояние открытия фильтра const [filterOpen, setFilterOpen] = useState(true); // Состояние данных по умолчанию для фильтра const [defaultLoaded, setDefaultLoaded] = useState(false); // Состояние хранения копии фильтра const [filterCopy, setFilterCopy] = useState({ ...filter }); // Состояние ограничения редактирования фильтра const [filterLock, setFilterLock] = useState(false); // Состояние ячейки заголовка даты (по раскрытию/скрытию) const [activeRef, setActiveRef] = useState(); // Состояние актуальности ссылки на ячейку const [refIsDeprecated, setRidFlag] = useState(true); //Подключение к контексту приложения const { pOnlineShowDictionary, pOnlineShowUnit } = useContext(ApplicationСtx); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); //Подключение к контексту сообщений const { showMsgErr } = useContext(MessagingСtx); //Загрузка данных таблицы с сервера const loadData = useCallback(async () => { if (dataGrid.reload) { const data = await executeStored({ stored: "PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID", args: { SBELONG: filter.belong, SPRODOBJ: filter.prodObj, STECHSERV: filter.techServ, SRESPDEP: filter.respDep, NFROMMONTH: filter.fromMonth, NFROMYEAR: filter.fromYear, NTOMONTH: filter.toMonth, NTOYEAR: filter.toYear }, respArg: "COUT", attributeValueProcessor: (name, val) => (["caption", "name", "parent"].includes(name) ? undefined : val) }); let cP = 0; let sP = 0; let cF = 0; let sF = 0; let properties = []; if (data.XROWS != null) { data.XROWS.map(row => { properties = []; Object.entries(row).forEach(([key, value]) => properties.push({ name: key, data: value })); let info2 = properties.find(element => { return element.name === "SINFO2"; }); if (info2 != undefined) { if (info2.data == "План") { properties.map(p => { if (DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1; }); } else if (info2.data == "Факт") { properties.map(p => { if (DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1; }); } } else { properties.map(p => { if (MONTH_NAME_REG_EXP.test(p.name)) { let str = p.data; let m = []; let i = 0; while ((m = DIGITS_REG_EXP.exec(str)) != null) { if (i == 0) sP = sP + Number(m[0].replace(",", ".")); else { sF = sF + Number(m[0].replace(",", ".")); } i++; } } }); } }); } setDataGrid(pv => ({ ...pv, columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, rows: [...(data.XROWS || [])], groups: [...(data.XGROUPS || [])], dataLoaded: true, reload: false })); } }, [dataGrid.reload, filter, executeStored]); //Загрузка значений фильра по умолчанию const loadDefaultFilter = useCallback(async () => { const data = await executeStored({ stored: "PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP", respArg: "COUT" }); setFilter(pv => ({ ...pv, belong: data.JURPERS, fromMonth: 1, fromYear: data.YEAR, toMonth: 12, toYear: data.YEAR })); setDefaultLoaded(true); }, [executeStored]); // Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты const showEquipSrv = async ({ date, workType, info }) => { const [techName, servKind] = info.split("_"); let type; if (workType == "План") type = 0; else type = 1; let [year, month, day] = date.substring(1).split("_"); const data = await executeStored({ stored: "PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV", args: { SBELONG: filter.belong, SPRODOBJ: filter.prodObj, STECHSERV: filter.techServ ? filter.techServ : null, SRESPDEP: filter.respDep ? filter.respDep : null, STECHNAME: techName, SSRVKIND: servKind, NYEAR: Number(year), NMONTH: Number(month), NDAY: day ? Number(day) : null, NWORKTYPE: type } }); if (data.NIDENT) { if (type == 0) pOnlineShowUnit({ unitCode: "EquipTechServices", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] }); else pOnlineShowUnit({ unitCode: "EquipRepairSheets", inputParameters: [{ name: "in_Ident", value: data.NIDENT }] }); } else showMsgErr(TEXTS.NO_DATA_FOUND); }; // Открыть фильтр const openFilter = () => { setFilterOpen(true); }; // Закрыть фильтр const closeFilter = e => { if (filterLock && e != undefined) setFilter(filterCopy); setFilterOpen(false); }; // Очистить фильтр const clearFilter = () => { setFilter({ belong: "", prodObj: "", techServ: "", respDep: "", fromMonth: "", fromYear: "", toMonth: "", toYear: "" }); }; // Отработка события скрытия/раскрытия ячейки даты const handleClick = (e, ref) => { const curCell = ref.current; if (e.target.type == "button" || e.target.offsetParent.type == "button") { setActiveRef(curCell); setRidFlag(false); } }; // При необходимости обновить данные таблицы useEffect(() => { loadData(); }, [loadData, dataGrid.reload]); // При открытом фильтре useEffect(() => { if (filterOpen) { { setFilterCopy({ ...filter }); if (!defaultLoaded) loadDefaultFilter(); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterOpen]); // При нажатии скрытии/раскрытии ячейки даты, фокус на неё useEffect(() => { if (!refIsDeprecated) { if (activeRef) { var cellRect = activeRef.getBoundingClientRect(); window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0); setRidFlag(true); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [refIsDeprecated]); let yearArray = []; const monthArray = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]; let today = new Date(); // Получение списка лет const getYearArray = () => { for (let i = 1990; i <= today.getFullYear(); i++) { yearArray.push(i); } }; //Генерация содержимого return (
{getYearArray()} Фильтр отбора theme.palette.grey[500] }} > close Принадлежность { pOnlineShowDictionary({ unitCode: "JuridicalPersons", callBack: res => res.success === true ? setFilter(pv => ({ ...pv, belong: res.outParameters.out_CODE })) : null }); }} edge="end" > list } aria-describedby="belong-outlined-helper-text" label="Принадлежность" /> {filter.belong ? null : ( *Обязательное поле )} Производственный объект { pOnlineShowDictionary({ unitCode: "EquipConfiguration", callBack: res => res.success === true ? setFilter(pv => ({ ...pv, prodObj: res.outParameters.out_CODE })) : null }); }} edge="end" > list } aria-describedby="prodObj-outlined-helper-text" label="Производственный объект" /> {filter.prodObj ? null : ( *Обязательное поле )} Техническая служба { pOnlineShowDictionary({ unitCode: "INS_DEPARTMENT", callBack: res => res.success === true ? setFilter(pv => ({ ...pv, techServ: res.outParameters.out_CODE })) : null }); }} edge="end" > list } label="Техническая служба" /> Ответственное подразделение { pOnlineShowDictionary({ unitCode: "INS_DEPARTMENT", callBack: res => res.success === true ? setFilter(pv => ({ ...pv, respDep: res.outParameters.out_CODE })) : null }); }} edge="end" > list } label="Ответственное подразделение" /> Начало периода: Месяц {filter.fromMonth ? null : ( *Обязательное поле )} Год {filter.fromYear ? null : ( *Обязательное поле )} Конец периода: Месяц {filter.toMonth ? null : ( *Обязательное поле )} Год {filter.toYear ? null : ( *Обязательное поле )} Фильтр отбора: {filter.belong ? `Принадлежность: ${filter.belong}` : ""}{" "} {filter.prodObj ? `Производственный объект: ${filter.prodObj}` : ""} {filter.techServ ? `Техническая служба: ${filter.techServ}` : ""}{" "} {filter.respDep ? `Ответственное подразделение: ${filter.respDep}` : ""}{" "} {filter.fromMonth && filter.fromYear ? `Начало периода: ${filter.fromMonth < 10 ? "0" + filter.fromMonth : filter.fromMonth}.${filter.fromYear}` : ""}{" "} {filter.toMonth && filter.toYear ? `Конец периода: ${filter.toMonth < 10 ? "0" + filter.toMonth : filter.toMonth}.${filter.toYear}` : ""} {dataGrid.dataLoaded ? ( headCellRender({ ...prms }, handleClick)} dataCellRender={prms => dataCellRender({ ...prms }, showEquipSrv)} groupCellRender={prms => groupCellRender({ ...prms })} showCellRightBorder={true} /> ) : null}
); }; //---------------- //Интерфейс модуля //---------------- export { EqsPrfrm };