WEB APP: Панели ПУДП "Производственный план цеха" и "Загрузка цеха" - фиксированные колонки и косметика

This commit is contained in:
Mikhail Chechnev 2024-05-09 17:48:24 +03:00
parent 5a54cb5ee1
commit 320521a054
5 changed files with 168 additions and 175 deletions

View File

@ -8,7 +8,7 @@
//--------------------- //---------------------
import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React
import { Typography, Box } from "@mui/material"; //Интерфейсные элементы import { Typography, Box, Grid } from "@mui/material"; //Интерфейсные элементы
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
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"; //Подключение компонентов к настройкам приложения
@ -24,7 +24,17 @@ const DATA_GRID_PAGE_SIZE = 5;
//Стили //Стили
const STYLES = { const STYLES = {
CONTAINER: { textAlign: "center", paddingTop: "20px" }, CONTAINER: { textAlign: "center", paddingTop: "20px" },
TITLE: { paddingBottom: "15px" } TITLE: { paddingBottom: "15px" },
DATA_GRID_CONTAINER: { minWidth: "95vw", maxWidth: "95vw", minHeight: "80vh", maxHeight: "80vh" },
DATA_GRID_CELL: (row, columnDef) => ({
padding: "8px",
textOverflow: "ellipsis",
overflow: "hidden",
whiteSpace: "pre",
...(columnDef.name.match(/N.*_VALUE/) && row[columnDef.name]
? { backgroundColor: row[`${columnDef.name.substring(0, 12)}_TYPE`] === 0 ? "lightgrey" : "lightgreen" }
: {})
})
}; };
//------------------------------------ //------------------------------------
@ -32,25 +42,11 @@ const STYLES = {
//------------------------------------ //------------------------------------
//Генерация заливки строки исходя от значений //Генерация заливки строки исходя от значений
const dataCellRender = ({ row, columnDef }) => { const dataCellRender = ({ row, columnDef }) => ({
//Описываем общие свойства cellProps: { title: row[columnDef.name] },
let cellProps = { title: row[columnDef.name] }; cellStyle: STYLES.DATA_GRID_CELL(row, columnDef),
//Описываем общий стиль data: row[columnDef]
let cellStyle = { padding: "8px", maxWidth: "300px", textOverflow: "ellipsis", overflow: "hidden", whiteSpace: "pre" }; });
//
if (columnDef.name.match(/N.*_VALUE/) && row[columnDef.name]) {
if (row[`${columnDef.name.substring(0, 12)}_TYPE`] === 0) {
cellStyle = { ...cellStyle, backgroundColor: "lightgrey" };
} else {
cellStyle = { ...cellStyle, backgroundColor: "lightgreen" };
}
}
return {
cellProps,
cellStyle,
data: row[columnDef]
};
};
//----------- //-----------
//Тело модуля //Тело модуля
@ -68,7 +64,9 @@ const MechRecDeptCostJobs = () => {
rows: [], rows: [],
reload: true, reload: true,
pageNumber: 1, pageNumber: 1,
morePages: true morePages: true,
fixedHeader: false,
fixedColumns: 0
}); });
//Подключение к контексту взаимодействия с сервером //Подключение к контексту взаимодействия с сервером
@ -86,12 +84,12 @@ const MechRecDeptCostJobs = () => {
NPAGE_SIZE: DATA_GRID_PAGE_SIZE, NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
NINCLUDE_DEF: costJobs.dataLoaded ? 0 : 1 NINCLUDE_DEF: costJobs.dataLoaded ? 0 : 1
}, },
respArg: "COUT", respArg: "COUT"
isArray: name => name === "XCOLUMNS_DEF" || name === "XROWS",
attributeValueProcessor: (name, val) => (name === "caption" ? undefined : val)
}); });
setCostJobs(pv => ({ setCostJobs(pv => ({
...pv, ...pv,
fixedHeader: data.XFCJOBS.XDATA.XDATA_GRID.fixedHeader,
fixedColumns: data.XFCJOBS.XDATA.XDATA_GRID.fixedColumns,
subdiv: data.XINFO.SSUBDIV, subdiv: data.XINFO.SSUBDIV,
columnsDef: data.XFCJOBS.XDATA.XCOLUMNS_DEF ? [...data.XFCJOBS.XDATA.XCOLUMNS_DEF] : pv.columnsDef, columnsDef: data.XFCJOBS.XDATA.XCOLUMNS_DEF ? [...data.XFCJOBS.XDATA.XCOLUMNS_DEF] : pv.columnsDef,
rows: pv.pageNumber == 1 ? [...(data.XFCJOBS.XDATA.XROWS || [])] : [...pv.rows, ...(data.XFCJOBS.XDATA.XROWS || [])], rows: pv.pageNumber == 1 ? [...(data.XFCJOBS.XDATA.XROWS || [])] : [...pv.rows, ...(data.XFCJOBS.XDATA.XROWS || [])],
@ -119,15 +117,18 @@ const MechRecDeptCostJobs = () => {
//Генерация содержимого //Генерация содержимого
return ( return (
<div style={STYLES.CONTAINER}> <div style={STYLES.CONTAINER}>
<Box> <Typography sx={STYLES.TITLE} variant={"h6"}>
{costJobs.dataLoaded ? ( {costJobs.dataLoaded ? `Загрузка станков "${costJobs.subdiv}"` : null}
<> </Typography>
<Typography sx={STYLES.TITLE} variant={"h6"}> <Grid container spacing={1}>
{`Загрузка станков "${costJobs.subdiv}"`} <Grid item xs={12}>
</Typography> <Box pt={1} display="flex" justifyContent="center" alignItems="center">
<Box px={1}> {costJobs.dataLoaded ? (
<P8PDataGrid <P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS} {...P8P_DATA_GRID_CONFIG_PROPS}
containerComponentProps={{ elevation: 6, style: STYLES.DATA_GRID_CONTAINER }}
fixedHeader={costJobs.fixedHeader}
fixedColumns={costJobs.fixedColumns}
columnsDef={costJobs.columnsDef} columnsDef={costJobs.columnsDef}
rows={costJobs.rows} rows={costJobs.rows}
size={P8P_DATA_GRID_SIZE.LARGE} size={P8P_DATA_GRID_SIZE.LARGE}
@ -138,10 +139,10 @@ const MechRecDeptCostJobs = () => {
onPagesCountChanged={handlePagesCountChanged} onPagesCountChanged={handlePagesCountChanged}
dataCellRender={prms => dataCellRender({ ...prms })} dataCellRender={prms => dataCellRender({ ...prms })}
/> />
</Box> ) : null}
</> </Box>
) : null} </Grid>
</Box> </Grid>
</div> </div>
); );
}; };

View File

@ -9,7 +9,7 @@
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Typography, Box, Paper, IconButton, Icon, Dialog, DialogContent, DialogActions, Button, TextField } from "@mui/material"; //Интерфейсные элементы import { Typography, Box, Paper, Dialog, DialogContent, DialogActions, Button, TextField } from "@mui/material"; //Интерфейсные элементы
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 { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
@ -44,7 +44,7 @@ export const rowExpandRender = ({ row }) => {
}; };
//Форматирование значений колонок //Форматирование значений колонок
const dataCellRender = ({ row, columnDef, handlePriorEditOpen, handleOrderEditOpen }) => { const dataCellRender = ({ row, columnDef /*, handlePriorEditOpen, handleOrderEditOpen */ }) => {
//!!! Пока отключено - не удалять //!!! Пока отключено - не удалять
// switch (columnDef.name) { // switch (columnDef.name) {
// case "NPRIOR_PARTY": // case "NPRIOR_PARTY":
@ -287,12 +287,7 @@ const CostRouteListsDataGrid = ({ task }) => {
onClick={() => { onClick={() => {
pOnlineShowDictionary({ pOnlineShowDictionary({
unitCode: "FaceAccounts", unitCode: "FaceAccounts",
inputParameters: [ inputParameters: [{ name: "in_NUMB", value: costRouteLists.editOrderValue }],
{
name: "in_NUMB",
value: costRouteLists.editOrderValue
}
],
callBack: res => (res.success === true ? setEditOrderValue(res.outParameters.out_NUMB) : null) callBack: res => (res.success === true ? setEditOrderValue(res.outParameters.out_NUMB) : null)
}); });
}} }}
@ -321,8 +316,30 @@ CostRouteListsDataGrid.propTypes = {
task: PropTypes.number.isRequired task: PropTypes.number.isRequired
}; };
//Диалог с таблицей сдачи продукции
const CostRouteListsDataGridDialog = ({ task, onClose }) => {
return (
<Dialog open onClose={onClose ? onClose : null} fullWidth maxWidth="xl">
<DialogContent>
<CostRouteListsDataGrid task={task} />
</DialogContent>
{onClose ? (
<DialogActions>
<Button onClick={onClose}>Закрыть</Button>
</DialogActions>
) : null}
</Dialog>
);
};
//Контроль свойств - Диалог с таблицей маршрутных листов
CostRouteListsDataGridDialog.propTypes = {
task: PropTypes.number.isRequired,
onClose: PropTypes.func
};
//---------------- //----------------
//Интерфейс модуля //Интерфейс модуля
//---------------- //----------------
export { CostRouteListsDataGrid }; export { CostRouteListsDataGridDialog };

View File

@ -9,7 +9,7 @@
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Typography, Box } from "@mui/material"; //Интерфейсные элементы import { Typography, Box, Dialog, DialogContent, DialogActions, Button } from "@mui/material"; //Интерфейсные элементы
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 { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
@ -113,8 +113,30 @@ IncomFromDepsDataGrid.propTypes = {
task: PropTypes.number.isRequired task: PropTypes.number.isRequired
}; };
//Диалог с таблицей сдачи продукции
const IncomFromDepsDataGridDialog = ({ task, onClose }) => {
return (
<Dialog open onClose={onClose ? onClose : null} fullWidth maxWidth="xl">
<DialogContent>
<IncomFromDepsDataGrid task={task} />
</DialogContent>
{onClose ? (
<DialogActions>
<Button onClick={onClose}>Закрыть</Button>
</DialogActions>
) : null}
</Dialog>
);
};
//Контроль свойств - Диалог с таблицей сдачи продукции
IncomFromDepsDataGridDialog.propTypes = {
task: PropTypes.number.isRequired,
onClose: PropTypes.func
};
//---------------- //----------------
//Интерфейс модуля //Интерфейс модуля
//---------------- //----------------
export { IncomFromDepsDataGrid }; export { IncomFromDepsDataGridDialog };

View File

@ -9,29 +9,15 @@
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField, Link, Grid } from "@mui/material"; //Интерфейсные элементы
Drawer,
Fab,
Box,
List,
ListItemButton,
ListItemText,
Typography,
TextField,
Link,
Dialog,
DialogContent,
DialogActions,
Button
} from "@mui/material"; //Интерфейсные элементы
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { useFilteredPlans } from "./hooks"; //Вспомогательные хуки import { useFilteredPlans } from "./hooks"; //Вспомогательные хуки
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
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 { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { IncomFromDepsDataGrid } from "./incomefromdeps"; //Таблица сдачи продукции import { IncomFromDepsDataGridDialog } from "./incomefromdeps"; //Диалог сдачи продукции
import { CostRouteListsDataGrid } from "./fcroutlst"; //Таблица маршрутных листов import { CostRouteListsDataGridDialog } from "./fcroutlst"; //Диалог маршрутных листов
//--------- //---------
//Константы //Константы
@ -41,7 +27,7 @@ import { CostRouteListsDataGrid } from "./fcroutlst"; //Таблица марш
const STYLES = { const STYLES = {
PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" }, PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" },
PLANS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" }, PLANS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" },
PLANS_BUTTON: { position: "absolute" }, PLANS_BUTTON: { position: "absolute", marginTop: "10px", marginLeft: "10px" },
PLANS_DRAWER: { PLANS_DRAWER: {
width: "350px", width: "350px",
display: "inline-block", display: "inline-block",
@ -49,6 +35,12 @@ const STYLES = {
[`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" } [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" }
}, },
CONTAINER: { paddingTop: "40px", margin: "5px 0px", textAlign: "center" }, CONTAINER: { paddingTop: "40px", margin: "5px 0px", textAlign: "center" },
DATA_GRID_CONTAINER: { minWidth: "95vw", maxWidth: "95vw", minHeight: "80vh", maxHeight: "80vh" },
DATA_GRID_GROUP_CELL: { padding: "2px" },
DATA_GRID_CELL: { padding: "8px", maxWidth: "300px", textOverflow: "ellipsis", overflow: "hidden", whiteSpace: "pre" },
DATA_GRID_CELL_STATUS: (currentStyle, row) => ({ backgroundColor: getRowBackgroudColor(row), ...currentStyle }),
DATA_GRID_CELL_PLAN_FACT: currentStyle => ({ ...currentStyle, backgroundColor: "lightgrey" }),
DATA_GRID_CELL_MATRES_CODE: (currentStyle, row) => ({ backgroundColor: getRowBackgroudColor(row), ...currentStyle }),
PLAN_FACT_VALUE: { textAlign: "center", display: "flex", justifyContent: "center" }, PLAN_FACT_VALUE: { textAlign: "center", display: "flex", justifyContent: "center" },
PLAN_FACT_DELIMITER: { padding: "0px 5px" }, PLAN_FACT_DELIMITER: { padding: "0px 5px" },
FACT_VALUE: { color: "blue" } FACT_VALUE: { color: "blue" }
@ -60,60 +52,35 @@ const STYLES = {
//Генерация представления ячейки заголовка группы //Генерация представления ячейки заголовка группы
export const groupCellRender = ({ group }) => ({ export const groupCellRender = ({ group }) => ({
cellStyle: { padding: "2px" }, cellStyle: STYLES.DATA_GRID_GROUP_CELL,
data: group.caption data: group.caption
}); });
//Вычисление цвета заливки для строки
const getRowBackgroudColor = row => {
//Факт === План
if (row["NMAIN_QUANT"] === row["NREL_FACT"]) return "lightgreen";
//План <= (Факт + Запущено)
if (row["NMAIN_QUANT"] <= row["NREL_FACT"] + row["NFCROUTLST_QUANT"]) return "lightblue";
//Сумма "Количество план" = 0 или < "План"
if (row["NSUM_PLAN"] === 0 || (row["NSUM_PLAN"] !== 0 && row["NSUM_PLAN"] < row["NMAIN_QUANT"])) {
//"Факт" >= "План"
if (row["NREL_FACT"] >= row["NMAIN_QUANT"]) return "#F0E68C";
} else {
//Сумма "Количество факт" >= сумма "Количество план"
if (row["NSUM_FACT"] >= row["NSUM_PLAN"]) return "#F0E68C";
}
return "lightcoral";
};
//Генерация заливки строки исходя от значений //Генерация заливки строки исходя от значений
const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCodeClick }) => { const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCodeClick }) => {
//Описываем общие свойства //Описываем общие свойства
let cellProps = { title: row[columnDef.name] }; let cellProps = { title: row[columnDef.name] };
//Описываем общий стиль //Описываем общий стиль
let cellStyle = { padding: "8px", maxWidth: "300px", textOverflow: "ellipsis", overflow: "hidden", whiteSpace: "pre" }; let cellStyle = STYLES.DATA_GRID_CELL;
//Для колонки "Статус" //Для колонки "Статус"
if (columnDef.name === "SSTATUS") { if (columnDef.name === "SSTATUS") return { cellProps, cellStyle: STYLES.DATA_GRID_CELL_STATUS(cellStyle, row), data: row[columnDef] };
//Факт === План
if (row["NMAIN_QUANT"] === row["NREL_FACT"]) {
return {
cellProps,
cellStyle: { backgroundColor: "lightgreen", ...cellStyle },
data: row[columnDef]
};
}
//План <= (Факт + Запущено)
if (row["NMAIN_QUANT"] <= row["NREL_FACT"] + row["NFCROUTLST_QUANT"]) {
return {
cellProps,
cellStyle: { backgroundColor: "lightblue", ...cellStyle },
data: row[columnDef]
};
}
//Сумма "Количество план" = 0 или < "План"
if (row["NSUM_PLAN"] === 0 || (row["NSUM_PLAN"] !== 0 && row["NSUM_PLAN"] < row["NMAIN_QUANT"])) {
//"Факт" >= "План"
if (row["NREL_FACT"] >= row["NMAIN_QUANT"]) {
return {
cellProps,
cellStyle: { backgroundColor: "#F0E68C", ...cellStyle },
data: row[columnDef]
};
}
} else {
//Сумма "Количество факт" >= сумма "Количество план"
if (row["NSUM_FACT"] >= row["NSUM_PLAN"]) {
return {
cellProps,
cellStyle: { backgroundColor: "#F0E68C", ...cellStyle },
data: row[columnDef]
};
}
}
return {
cellProps,
cellStyle: { backgroundColor: "lightcoral", ...cellStyle },
data: row[columnDef]
};
}
//Для колонки даты //Для колонки даты
if (columnDef.name.indexOf("PLAN_FACT") >= 0) { if (columnDef.name.indexOf("PLAN_FACT") >= 0) {
//Получаем текущий день //Получаем текущий день
@ -121,10 +88,8 @@ const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCode
//Формируем regex для проверки //Формируем regex для проверки
let regex = new RegExp(`N_${curDay}.*`, "g"); let regex = new RegExp(`N_${curDay}.*`, "g");
//Если это значение текущего дня //Если это значение текущего дня
if (columnDef.name.match(regex)) { if (columnDef.name.match(regex)) cellStyle = STYLES.DATA_GRID_CELL_PLAN_FACT(cellStyle);
cellStyle = { ...cellStyle, backgroundColor: "lightgrey" }; //Если в колонке есть значение
}
//Если в колонке есть значени
if (row[columnDef.name]) { if (row[columnDef.name]) {
//Разбиваем его на план/факт //Разбиваем его на план/факт
let values = row[columnDef.name].split("/"); let values = row[columnDef.name].split("/");
@ -140,14 +105,7 @@ const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCode
</Box> </Box>
) )
}; };
} else { } else return { cellProps, cellStyle, data: row[columnDef] };
//Если значения нет
return {
cellProps,
cellStyle,
data: row[columnDef]
};
}
} }
//Для колонки "Заказ" //Для колонки "Заказ"
if (columnDef.name === "SPROD_ORDER") { if (columnDef.name === "SPROD_ORDER") {
@ -162,22 +120,18 @@ const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCode
}; };
} }
//Для колонки "Обозначение" //Для колонки "Обозначение"
if (columnDef.name === "SMATRES_CODE") { if (columnDef.name === "SMATRES_CODE")
return { return {
cellProps, cellProps,
cellStyle, cellStyle: STYLES.DATA_GRID_CELL_MATRES_CODE(cellStyle, row),
data: ( data: (
<Link component="button" variant="body2" align="left" underline="hover" onClick={() => handleMatresCodeClick(row["NRN"])}> <Link component="button" variant="body2" align="left" underline="hover" onClick={() => handleMatresCodeClick(row["NRN"])}>
{row[columnDef.name]} {row[columnDef.name]}
</Link> </Link>
) )
}; };
} //Для всех остальных
return { return { cellProps, cellStyle, data: row[columnDef] };
cellProps,
cellStyle,
data: row[columnDef]
};
}; };
//Список каталогов планов //Список каталогов планов
@ -237,7 +191,9 @@ const MechRecDeptCostProdPlans = () => {
rows: [], rows: [],
reload: true, reload: true,
pageNumber: 1, pageNumber: 1,
morePages: true morePages: true,
fixedHeader: false,
fixedColumns: 0
}); });
//Состояние для фильтра каталогов //Состояние для фильтра каталогов
@ -287,6 +243,8 @@ const MechRecDeptCostProdPlans = () => {
}); });
setState(pv => ({ setState(pv => ({
...pv, ...pv,
fixedHeader: data.XDATA_GRID.fixedHeader,
fixedColumns: data.XDATA_GRID.fixedColumns,
columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
dataLoaded: true, dataLoaded: true,
@ -373,7 +331,7 @@ const MechRecDeptCostProdPlans = () => {
//Генерация содержимого //Генерация содержимого
return ( return (
<Box p={2}> <>
<Fab variant="extended" sx={STYLES.PLANS_BUTTON} onClick={() => setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> <Fab variant="extended" sx={STYLES.PLANS_BUTTON} onClick={() => setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}>
Планы Планы
</Fab> </Fab>
@ -393,48 +351,43 @@ const MechRecDeptCostProdPlans = () => {
</Drawer> </Drawer>
<div style={STYLES.CONTAINER}> <div style={STYLES.CONTAINER}>
{state.dataLoaded ? ( {state.dataLoaded ? (
<> <Typography variant={"h6"}>
<Typography {`Производственный план цеха "${state.selectedPlan.SSUBDIV}" на ${state.selectedPlan.SPERIOD}`}
variant={"h6"} </Typography>
>{`Производственный план цеха "${state.selectedPlan.SSUBDIV}" на ${state.selectedPlan.SPERIOD}`}</Typography> ) : null}
<P8PDataGrid <Grid container spacing={1}>
{...P8P_DATA_GRID_CONFIG_PROPS} <Grid item xs={12}>
columnsDef={state.columnsDef} <Box pt={1} display="flex" justifyContent="center" alignItems="center">
rows={state.rows} {state.dataLoaded ? (
size={P8P_DATA_GRID_SIZE.MEDIUM} <P8PDataGrid
morePages={state.morePages} {...P8P_DATA_GRID_CONFIG_PROPS}
reloading={state.reload} containerComponentProps={{ elevation: 6, style: STYLES.DATA_GRID_CONTAINER }}
onOrderChanged={handleOrderChanged} fixedHeader={state.fixedHeader}
onPagesCountChanged={handlePagesCountChanged} fixedColumns={state.fixedColumns}
dataCellRender={prms => dataCellRender({ ...prms, handleProdOrderClick, handleMatresCodeClick })} columnsDef={state.columnsDef}
groupCellRender={groupCellRender} rows={state.rows}
/> size={P8P_DATA_GRID_SIZE.MEDIUM}
</> morePages={state.morePages}
) : !state.selectedPlan.NRN ? ( reloading={state.reload}
<InlineMsgInfo okBtn={false} text={"Укажите план для отображения его спецификаций"} /> onOrderChanged={handleOrderChanged}
onPagesCountChanged={handlePagesCountChanged}
dataCellRender={prms => dataCellRender({ ...prms, handleProdOrderClick, handleMatresCodeClick })}
groupCellRender={groupCellRender}
/>
) : !state.selectedPlan.NRN ? (
<InlineMsgInfo okBtn={false} text={"Укажите план для отображения его спецификаций"} />
) : null}
</Box>
</Grid>
</Grid>
{state.showIncomeFromDeps ? (
<IncomFromDepsDataGridDialog task={state.showIncomeFromDeps} onClose={() => handleProdOrderClick(null)} />
) : null}
{state.showFcroutelst ? (
<CostRouteListsDataGridDialog task={state.showFcroutelst} onClose={() => handleMatresCodeClick(null)} />
) : null} ) : null}
</div> </div>
{state.showIncomeFromDeps ? ( </>
<Dialog open onClose={() => handleProdOrderClick(null)} fullWidth maxWidth="xl">
<DialogContent>
<IncomFromDepsDataGrid task={state.showIncomeFromDeps} />
</DialogContent>
<DialogActions>
<Button onClick={() => handleProdOrderClick(null)}>Закрыть</Button>
</DialogActions>
</Dialog>
) : null}
{state.showFcroutelst ? (
<Dialog open onClose={() => handleMatresCodeClick(null)} fullWidth maxWidth="xl">
<DialogContent>
<CostRouteListsDataGrid task={state.showFcroutelst} />
</DialogContent>
<DialogActions>
<Button onClick={() => handleMatresCodeClick(null)}>Закрыть</Button>
</DialogActions>
</Dialog>
) : null}
</Box>
); );
}; };

View File

@ -105,7 +105,7 @@
desc="Управление составом сменных заданий цеха/участка" desc="Управление составом сменных заданий цеха/участка"
url="mech_rec_cost_jobs_manage" url="mech_rec_cost_jobs_manage"
path="mech_rec_cost_jobs_manage" path="mech_rec_cost_jobs_manage"
icon="free_cancellation" icon="psychology"
showInPanelsList="true" showInPanelsList="true"
preview="./img/mech_rec_cost_prod_plans.jpg"/> preview="./img/mech_rec_cost_prod_plans.jpg"/>
<Panel <Panel
@ -115,7 +115,7 @@
desc="Просмотр сведений о производственной загрузке цеха/участка" desc="Просмотр сведений о производственной загрузке цеха/участка"
url="mech_rec_dept_cost_jobs" url="mech_rec_dept_cost_jobs"
path="mech_rec_dept_cost_jobs" path="mech_rec_dept_cost_jobs"
icon="insert_invitation" icon="factory"
showInPanelsList="true" showInPanelsList="true"
preview="./img/mech_rec_cost_prod_plans.jpg"/> preview="./img/mech_rec_cost_prod_plans.jpg"/>
<Panel <Panel
@ -125,7 +125,7 @@
desc="Отображение текущего состояния комплектации и сборки изделий производственными подразделениями" desc="Отображение текущего состояния комплектации и сборки изделий производственными подразделениями"
url="mech_rec_assembly_mon" url="mech_rec_assembly_mon"
path="mech_rec_assembly_mon" path="mech_rec_assembly_mon"
icon="insert_invitation" icon="build"
showInPanelsList="true" showInPanelsList="true"
preview="./img/mech_rec_cost_prod_plans.jpg"/> preview="./img/mech_rec_cost_prod_plans.jpg"/>
<Panel <Panel