/* Парус 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 { headCellRender, dataCellRender, groupCellRender, DIGITS_REG_EXP, MONTH_NAME_REG_EXP, DAY_NAME_REG_EXP } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов //----------- //Тело модуля //----------- //Корневая панель выполнения работ const EqsPrfrm = () => { //Собственное состояние - таблица данных const [dataGrid, setDataGrid] = useState({ dataLoaded: false, columnsDef: [], groups: [], rows: [], reload: false }); const [filter, setFilter] = useState({ belong: "Демопример", prodObj: "К2", techServ: "", respDep: "", fromMonth: 1, fromYear: 2024, toMonth: 12, toYear: 2024 }); // const [filter, setFilter] = useState({ // belong: "", // prodObj: "", // techServ: "", // respDep: "", // fromMonth: "", // fromYear: "", // toMonth: "", // toYear: ""}); const [info, setInfo] = useState({ cntP: 0, sumP: 0, cntF: 0, sumF: 0 }); //Подключение к контексту приложения const { pOnlineShowDictionary } = useContext(ApplicationСtx); const [filterOpen, setFilterOpen] = useState(false); const [filterCopy, setFilterCopy] = useState({ ...filter }); const [filterLock, setFilterLock] = useState(false); 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: "" }); }; let yearArray = []; let today = new Date(); const getYearArray = () => { for (let i = 1990; i <= today.getFullYear(); i++) { yearArray.push(i); } }; const monthArray = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]; //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndС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 })); if (properties[1].data == "Факт" || properties[2].data == "План") { if (properties[2].data == "План") { properties.map(p => { if (DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1; }); } else if (properties[1].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++; } } }); } }); } setInfo({ cntP: cP, sumP: sP, cntF: cF, sumF: sF }); 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]); //пользовательский параметр JuridicalPerson системы const getJurPers = useCallback(async () => { const data = await executeStored({ stored: "PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM", respArg: "CRES" }); setFilter(pv => ({ ...pv, belong: data })); }, [executeStored]); useEffect(() => { if (filterOpen) { setFilterCopy({ ...filter }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [filterOpen]); //При необходимости обновить данные таблицы useEffect(() => { loadData(); }, [loadData, dataGrid.reload]); //Генерация содержимого return (