WEB APP: Панели ПУДП "Производственный план цеха" и "Загрузка цеха" - фиксированные колонки и косметика
This commit is contained in:
parent
5a54cb5ee1
commit
320521a054
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -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 };
|
||||||
|
@ -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 };
|
||||||
|
@ -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>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user