345 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Парус 8 - Панели мониторинга - ПУП - Производственный план цеха
Компонент панели: Таблица маршрутных листов
*/
//---------------------
//Подключение библиотек
//---------------------
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Typography, Box, Paper, Dialog, DialogContent, DialogActions, Button, TextField } 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 { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
import { CostRouteListsOrdDataGrid } from "./fcroutlstord"; //Состояние таблицы заказов маршрутных листов
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
//---------
//Константы
//---------
//Стили
const STYLES = {
CONTAINER: { textAlign: "center" },
TABLE: { paddingTop: "15px" },
TABLE_SUM: { textAlign: "right", paddingTop: "5px", paddingRight: "15px" },
DIALOG_EDITOR: { maxWidth: "250px" },
DIALOG_BUTTONS: { marginTop: "10px", width: "240px" }
};
//---------------------------------------------
//Вспомогательные функции форматирования данных
//---------------------------------------------
//Генерация представления расширения строки
export const rowExpandRender = ({ row }) => {
return (
<Paper elevation={4}>
<CostRouteListsOrdDataGrid mainRowRN={row.NRN} />
</Paper>
);
};
//Форматирование значений колонок
const dataCellRender = ({ row, columnDef /*, handlePriorEditOpen, handleOrderEditOpen */ }) => {
//!!! Пока отключено - не удалять
// switch (columnDef.name) {
// case "NPRIOR_PARTY":
// return {
// data: (
// <>
// {row["NPRIOR_PARTY"]}
// <IconButton edge="end" title="Изменить приоритет" onClick={() => handlePriorEditOpen(row["NRN"], row["NPRIOR_PARTY"])}>
// <Icon>edit</Icon>
// </IconButton>
// </>
// )
// };
// case "NCHANGE_FACEACC":
// return {
// data: (
// <Box sx={{ textAlign: "center" }}>
// <IconButton title="Изменить заказ" onClick={() => handleOrderEditOpen(row["NRN"], row["SPROD_ORDER"])}>
// <Icon>inventory</Icon>
// </IconButton>
// </Box>
// )
// };
// }
return {
data: row[columnDef]
};
};
//-----------
//Тело модуля
//-----------
//Таблица маршрутных листов
const CostRouteListsDataGrid = ({ task }) => {
//Собственное состояние - таблица данных
const [costRouteLists, setCostRouteLists] = useState({
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true,
editPriorNRN: null,
editPriorValue: null,
editOrderNRN: null,
editOrderValue: null
});
//Подключение к контексту взаимодействия с сервером
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Подключение к контексту приложения
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
//Размер страницы данных
const DATA_GRID_PAGE_SIZE = 5;
//Загрузка данных таблицы с сервера
const loadData = useCallback(async () => {
if (costRouteLists.reload) {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCROUTLST_DEPT_DG_GET",
args: {
NFCPRODPLANSP: task,
CORDERS: { VALUE: object2Base64XML(costRouteLists.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: costRouteLists.pageNumber,
NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1
},
respArg: "COUT"
});
setCostRouteLists(pv => ({
...pv,
columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
dataLoaded: true,
reload: false,
morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
}));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [
costRouteLists.reload,
costRouteLists.filters,
costRouteLists.orders,
costRouteLists.dataLoaded,
costRouteLists.pageNumber,
executeStored,
SERV_DATA_TYPE_CLOB
]);
//При необходимости обновить данные таблицы
useEffect(() => {
loadData();
}, [costRouteLists.reload, loadData]);
//При изменении состояния сортировки
const handleOrderChanged = ({ orders }) => setCostRouteLists(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
//При изменении количества отображаемых страниц
const handlePagesCountChanged = () => setCostRouteLists(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
//При открытии изменения приоритета партии
const handlePriorEditOpen = (NRN, nPriorValue) => {
setCostRouteLists(pv => ({ ...pv, editPriorNRN: NRN, editPriorValue: nPriorValue }));
};
//При закрытии изменения приоритета партии
const handlePriorEditClose = () => {
setCostRouteLists(pv => ({ ...pv, editPriorNRN: null, editPriorValue: null }));
};
//При изменении значения приоритета партии
const handlePriorFormChanged = e => {
setCostRouteLists(pv => ({ ...pv, editPriorValue: e.target.value }));
};
//Изменение приоритета
const priorChange = useCallback(
async (NRN, PriorValue, rows) => {
try {
await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCROUTLST_PRIOR_PARTY_UPDATE",
args: { NFCROUTLST: NRN, SPRIOR_PARTY: PriorValue }
});
//Изменяем значение приоритета у нужного
rows[rows.findIndex(obj => obj.NRN == NRN)].NPRIOR_PARTY = PriorValue;
//Актуализируем строки таблицы
setCostRouteLists(pv => ({ ...pv, rows: rows }));
//Закрываем окно
handlePriorEditClose();
} catch (e) {
throw new Error(e.message);
}
},
[executeStored]
);
//При нажатии на изменение приоритета партии
const handlePriorChange = () => {
//Изменяем значение
priorChange(costRouteLists.editPriorNRN, costRouteLists.editPriorValue, costRouteLists.rows);
};
//При открытии изменения заказа
const handleOrderEditOpen = (NRN, sProdOrderValue) => {
setCostRouteLists(pv => ({ ...pv, editOrderNRN: NRN, editOrderValue: sProdOrderValue }));
};
//При закрытии изменения заказа
const handleOrderEditClose = () => {
setCostRouteLists(pv => ({ ...pv, editOrderNRN: null, editOrderValue: null }));
};
//Изменение заказа
const setEditOrderValue = value => {
setCostRouteLists(pv => ({ ...pv, editOrderValue: value }));
};
//При изменении значения заказа
const handleOrderFormChanged = e => {
setEditOrderValue(e.target.value);
};
//При нажатии на изменение заказа
const handleOrderChange = () => {
//Изменяем значение
//priorChange(costRouteLists.editPriorNRN, costRouteLists.editPriorValue);
//Закрываем окно
handleOrderEditClose();
};
//Генерация содержимого
return (
<div style={STYLES.CONTAINER}>
<Typography variant={"h6"}>Маршрутные листы</Typography>
{costRouteLists.dataLoaded ? (
<>
<Box sx={STYLES.TABLE}>
<P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS}
columnsDef={costRouteLists.columnsDef}
rows={costRouteLists.rows}
size={P8P_DATA_GRID_SIZE.LARGE}
morePages={costRouteLists.morePages}
reloading={costRouteLists.reload}
expandable={true}
rowExpandRender={rowExpandRender}
onOrderChanged={handleOrderChanged}
onPagesCountChanged={handlePagesCountChanged}
dataCellRender={prms => dataCellRender({ ...prms, handlePriorEditOpen, handleOrderEditOpen })}
/>
</Box>
</>
) : null}
{costRouteLists.editPriorNRN ? (
<Dialog open onClose={() => handlePriorEditClose(null)} sx={STYLES.DIALOG_EDITOR}>
<DialogContent>
<Box>
<TextField
name="editPriorValue"
label="Новое значение приоритета"
variant="standard"
fullWidth
type="number"
value={costRouteLists.editPriorValue}
onChange={handlePriorFormChanged}
/>
<Box>
<Button onClick={handlePriorChange} variant="contained" sx={STYLES.DIALOG_BUTTONS}>
Изменить
</Button>
</Box>
</Box>
</DialogContent>
<DialogActions>
<Button onClick={() => handlePriorEditClose(null)}>Закрыть</Button>
</DialogActions>
</Dialog>
) : null}
{costRouteLists.editOrderNRN ? (
<Dialog open onClose={() => handleOrderEditClose(null)} sx={STYLES.DIALOG_EDITOR}>
<DialogContent>
<Box>
<TextField
name="editOrderValue"
label="Заказ"
variant="standard"
fullWidth
value={costRouteLists.editOrderValue}
onChange={handleOrderFormChanged}
/>
<Box>
<Button
sx={STYLES.DIALOG_BUTTONS}
variant="contained"
onClick={() => {
pOnlineShowDictionary({
unitCode: "FaceAccounts",
inputParameters: [{ name: "in_NUMB", value: costRouteLists.editOrderValue }],
callBack: res => (res.success === true ? setEditOrderValue(res.outParameters.out_NUMB) : null)
});
}}
>
Лицевые счета
</Button>
<Box>
<Button sx={STYLES.DIALOG_BUTTONS} onClick={handleOrderChange} variant="contained">
Изменить
</Button>
</Box>
</Box>
</Box>
</DialogContent>
<DialogActions>
<Button onClick={() => handleOrderEditClose(null)}>Закрыть</Button>
</DialogActions>
</Dialog>
) : null}
</div>
);
};
//Контроль свойств - Таблица маршрутных листов
CostRouteListsDataGrid.propTypes = {
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 { CostRouteListsDataGridDialog };