Compare commits

..

No commits in common. "b24c3c568902fb6abc2a9e2aff254beb4c3a9709" and "5b06da67c9c6f295421ab352d549fe146e6bd117" have entirely different histories.

4 changed files with 109 additions and 202 deletions

View File

@ -7,7 +7,7 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React, { useState, useEffect, useContext, useCallback } from "react"; //Классы React import React, { useState, useEffect, useContext } from "react"; //Классы React
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
@ -32,60 +32,17 @@ export const useFilteredPlans = (plans, filter) => {
return filteredPlans; return filteredPlans;
}; };
//Хук для планов //Хук для основной таблицы
const useDeptCostProdPlans = month => { const useDeptCostProdPlans = () => {
//Собственное состояние - таблица данных
const [state, setState] = useState({
init: false,
loaded: false,
showPlanList: false,
rows: [],
reload: true,
selected: {},
currentMonth: ""
});
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//При подключении компонента к странице
useEffect(() => {
const initPlans = async () => {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_DEPT_INIT",
args: { SMONTH: month },
respArg: "COUT",
isArray: name => name === "XFCPRODPLANS",
attributeValueProcessor: (name, val) => (name === "SPERIOD" ? undefined : val)
});
setState(pv => ({
...pv,
init: true,
rows: [...(data?.XFCPRODPLANS || [])],
loaded: true,
reload: false,
selected: {},
currentMonth: month
}));
};
//Если месяц указан и он не соответствует текущим данным
if (month && month !== state.currentMonth) {
initPlans();
}
}, [executeStored, month, state.currentMonth]);
//Возвращаем данные
return [state, setState];
};
//Хук для информации о плане
const useDeptCostProdPlanInfo = plan => {
//Собственное состояние - таблица данных //Собственное состояние - таблица данных
const [state, setState] = useState({ const [state, setState] = useState({
init: false, init: false,
showPlanList: false, showPlanList: false,
showIncomeFromDeps: null, showIncomeFromDeps: null,
showFcroutelst: null, showFcroutelst: null,
planList: [],
planListLoaded: false,
selectedPlan: {},
dataLoaded: false, dataLoaded: false,
columnsDef: [], columnsDef: [],
orders: null, orders: null,
@ -100,43 +57,14 @@ const useDeptCostProdPlanInfo = plan => {
//Подключение к контексту взаимодействия с сервером //Подключение к контексту взаимодействия с сервером
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx); const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//При необходимости очистки данных о плане
const handleClear = useCallback(
() =>
setState(pv => ({
...pv,
init: false,
showPlanList: false,
showIncomeFromDeps: null,
showFcroutelst: null,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true,
fixedHeader: false,
fixedColumns: 0
})),
[]
);
//При изменении состояния сортировки
const handleOrderChanged = ({ orders }) => setState(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
//При изменении количества отображаемых страниц
const handlePagesCountChanged = () => setState(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
//При необходимости обновить данные таблицы //При необходимости обновить данные таблицы
useEffect(() => { useEffect(() => {
//Если план выбран if (state.selectedPlan.NRN) {
if (plan.NRN) {
const loadData = async () => { const loadData = async () => {
const data = await executeStored({ const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODPLANSP_DEPT_DG_GET", stored: "PKG_P8PANELS_MECHREC.FCPRODPLANSP_DEPT_DG_GET",
args: { args: {
NFCPRODPLAN: plan.NRN, NFCPRODPLAN: state.selectedPlan.NRN,
CORDERS: { VALUE: object2Base64XML(state.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, CORDERS: { VALUE: object2Base64XML(state.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: state.pageNumber, NPAGE_NUMBER: state.pageNumber,
NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE, NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,
@ -148,7 +76,6 @@ const useDeptCostProdPlanInfo = plan => {
setState(pv => ({ setState(pv => ({
...pv, ...pv,
...data.XDATA_GRID, ...data.XDATA_GRID,
init: true,
columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,
rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],
dataLoaded: true, dataLoaded: true,
@ -156,20 +83,31 @@ const useDeptCostProdPlanInfo = plan => {
morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE
})); }));
}; };
//Если необходимо перезагрузить
if (state.reload) { if (state.reload) {
loadData(); loadData();
} }
} }
//Если план не выбран и есть какие-то данные }, [state.selectedPlan, state.reload, state.orders, state.pageNumber, state.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);
if (!plan.NRN && state.dataLoaded) {
//Очищаем их
handleClear();
}
}, [plan.NRN, state.reload, state.orders, state.pageNumber, state.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB, handleClear]);
//Возвращаем данные //При подключении компонента к странице
return [state, setState, handleClear, handleOrderChanged, handlePagesCountChanged]; useEffect(() => {
const initPlans = async () => {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_DEPT_INIT",
args: {},
respArg: "COUT",
isArray: name => name === "XFCPRODPLANS",
attributeValueProcessor: (name, val) => (name === "SPERIOD" ? undefined : val)
});
setState(pv => ({ ...pv, init: true, planList: [...(data?.XFCPRODPLANS || [])], planListLoaded: true }));
};
if (!state.init) {
initPlans();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return [state, setState];
}; };
//Хук для таблицы маршрутных листов //Хук для таблицы маршрутных листов
@ -226,7 +164,6 @@ const useCostRouteLists = task => {
task task
]); ]);
//Возвращаем данные
return [costRouteLists, setCostRouteLists]; return [costRouteLists, setCostRouteLists];
}; };
@ -286,7 +223,6 @@ const useCostRouteListsSpecs = mainRowRN => {
mainRowRN mainRowRN
]); ]);
//Возвращаем данные
return [costRouteListsSpecs, setCostRouteListsSpecs]; return [costRouteListsSpecs, setCostRouteListsSpecs];
}; };
@ -336,8 +272,7 @@ const useIncomFromDeps = task => {
} }
}, [SERV_DATA_TYPE_CLOB, executeStored, incomFromDeps.dataLoaded, incomFromDeps.orders, incomFromDeps.pageNumber, incomFromDeps.reload, task]); }, [SERV_DATA_TYPE_CLOB, executeStored, incomFromDeps.dataLoaded, incomFromDeps.orders, incomFromDeps.pageNumber, incomFromDeps.reload, task]);
//Возвращаем данные
return [incomFromDeps, setIncomFromDeps]; return [incomFromDeps, setIncomFromDeps];
}; };
export { useDeptCostProdPlans, useDeptCostProdPlanInfo, useCostRouteLists, useCostRouteListsSpecs, useIncomFromDeps }; export { useDeptCostProdPlans, useCostRouteLists, useCostRouteListsSpecs, useIncomFromDeps };

View File

@ -12,7 +12,7 @@ import PropTypes from "prop-types"; //Контроль свойств компо
import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField, Link, Grid } from "@mui/material"; //Интерфейсные элементы import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField, Link, Grid } from "@mui/material"; //Интерфейсные элементы
import { APP_STYLES } from "../../../app.styles"; //Типовые стили import { APP_STYLES } from "../../../app.styles"; //Типовые стили
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
import { useDeptCostProdPlans, useFilteredPlans, useDeptCostProdPlanInfo } from "./hooks"; //Вспомогательные хуки import { useDeptCostProdPlans, useFilteredPlans } from "./hooks"; //Вспомогательные хуки
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"; //Контекст сообщений
@ -34,8 +34,7 @@ const TITLE_PADDING_BOTTOM = "20px";
//Стили //Стили
const STYLES = { const STYLES = {
PLANS_FILTER: { paddingTop: "20px", display: "flex", flexDirection: "column", alignItems: "center", gap: "5px" }, PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" },
PLANS_FILTER_ITEM: { margin: "0px 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" },
PLANS_DRAWER: { PLANS_DRAWER: {
@ -61,18 +60,10 @@ const STYLES = {
FACT_VALUE: { color: "blue" } FACT_VALUE: { color: "blue" }
}; };
//Имена полей компонента
const SFIELD_MONTH = "month";
//------------------------------------ //------------------------------------
//Вспомогательные функции и компоненты //Вспомогательные функции и компоненты
//------------------------------------ //------------------------------------
//Считывание текущего года и месяца в формате "YYYY-MM"
const getCurrentYearMonth = () => {
return `${new Date().getFullYear()}-${String(new Date().getMonth() + 1).padStart(2, "0")}`;
};
//Генерация представления ячейки заголовка группы //Генерация представления ячейки заголовка группы
export const groupCellRender = ({ group }) => ({ export const groupCellRender = ({ group }) => ({
cellStyle: STYLES.DATA_GRID_GROUP_CELL, cellStyle: STYLES.DATA_GRID_GROUP_CELL,
@ -97,7 +88,7 @@ const getRowBackgroudColor = row => {
}; };
//Генерация заливки строки исходя от значений //Генерация заливки строки исходя от значений
const dataCellRender = ({ row, columnDef, onProdOrderClick, onMatresCodeClick }) => { const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCodeClick }) => {
//Описываем общие свойства //Описываем общие свойства
let cellProps = { title: row[columnDef.name] }; let cellProps = { title: row[columnDef.name] };
//Описываем общий стиль //Описываем общий стиль
@ -136,7 +127,7 @@ const dataCellRender = ({ row, columnDef, onProdOrderClick, onMatresCodeClick })
cellProps, cellProps,
cellStyle, cellStyle,
data: ( data: (
<Link component="button" variant="body2" align="left" underline="hover" onClick={() => onProdOrderClick(row["NRN"])}> <Link component="button" variant="body2" align="left" underline="hover" onClick={() => handleProdOrderClick(row["NRN"])}>
{row[columnDef.name]} {row[columnDef.name]}
</Link> </Link>
) )
@ -148,7 +139,7 @@ const dataCellRender = ({ row, columnDef, onProdOrderClick, onMatresCodeClick })
cellProps, cellProps,
cellStyle: STYLES.DATA_GRID_CELL_MATRES_CODE(cellStyle, row), cellStyle: STYLES.DATA_GRID_CELL_MATRES_CODE(cellStyle, row),
data: ( data: (
<Link component="button" variant="body2" align="left" underline="hover" onClick={() => onMatresCodeClick(row["NRN"])}> <Link component="button" variant="body2" align="left" underline="hover" onClick={() => handleMatresCodeClick(row["NRN"])}>
{row[columnDef.name]} {row[columnDef.name]}
</Link> </Link>
) )
@ -158,38 +149,21 @@ const dataCellRender = ({ row, columnDef, onProdOrderClick, onMatresCodeClick })
}; };
//Список каталогов планов //Список каталогов планов
const PlanList = ({ plans = [], selectedPlan, filter, onFilterChange, onClick } = {}) => { const PlanList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => {
//При изменении фильтра
const handleFilterChange = e => {
onFilterChange && onFilterChange(e);
};
//Генерация содержимого //Генерация содержимого
return ( return (
<div> <div>
<Box sx={STYLES.PLANS_FILTER}> <TextField
<TextField sx={STYLES.PLANS_FINDER}
sx={STYLES.PLANS_FILTER_ITEM} name="planFilter"
name={SFIELD_MONTH} label="План"
label="Месяц" value={filter.planName}
type="month" variant="standard"
value={filter.month} fullWidth
InputLabelProps={{ shrink: true }} onChange={event => {
variant="standard" setFilter(pv => ({ ...pv, planName: event.target.value }));
fullWidth }}
onChange={handleFilterChange} ></TextField>
required={true}
></TextField>
<TextField
sx={STYLES.PLANS_FILTER_ITEM}
name="planName"
label="План"
value={filter.planName}
variant="standard"
fullWidth
onChange={handleFilterChange}
></TextField>
</Box>
<List> <List>
{plans.map(p => ( {plans.map(p => (
<ListItemButton key={p.NRN} selected={p.NRN === selectedPlan.NRN} onClick={() => (onClick ? onClick(p) : null)}> <ListItemButton key={p.NRN} selected={p.NRN === selectedPlan.NRN} onClick={() => (onClick ? onClick(p) : null)}>
@ -207,7 +181,7 @@ PlanList.propTypes = {
selectedPlan: PropTypes.object, selectedPlan: PropTypes.object,
onClick: PropTypes.func, onClick: PropTypes.func,
filter: PropTypes.object, filter: PropTypes.object,
onFilterChange: PropTypes.func setFilter: PropTypes.func
}; };
//----------- //-----------
@ -216,135 +190,135 @@ PlanList.propTypes = {
//Корневая панель производственного плана цеха //Корневая панель производственного плана цеха
const MechRecDeptCostProdPlans = () => { const MechRecDeptCostProdPlans = () => {
//Собственное состояние - таблица данных
const [state, setState] = useDeptCostProdPlans();
//Состояние для фильтра каталогов //Состояние для фильтра каталогов
const [filter, setFilter] = useState({ planName: "", month: getCurrentYearMonth() }); const [filter, setFilter] = useState({ planName: "" });
//Собственное состояние - таблица планов
const [plans, setPlans] = useDeptCostProdPlans(filter.month);
//Собственное состояние - таблица информации
const [planInfo, setPlanInfo, onPlanInfoClear, onPlanInfoOrderChanged, onPlanInfoPagesCountChanged] = useDeptCostProdPlanInfo(plans.selected);
//Массив отфильтрованных каталогов //Массив отфильтрованных каталогов
const filteredPlanCtgls = useFilteredPlans(plans.rows, filter); const filteredPlanCtgls = useFilteredPlans(state.planList, filter);
//Подключение к контексту сообщений //Подключение к контексту сообщений
const { InlineMsgInfo } = useContext(MessagingСtx); const { InlineMsgInfo } = useContext(MessagingСtx);
//Выбор плана //Выбор плана
const selectPlan = plan => { const selectPlan = plan => {
setPlans(pv => ({ setState(pv => ({
...pv, ...pv,
selected: plan, showIncomeFromDeps: null,
showPlanList: false showFcroutelst: null,
selectedPlan: plan,
showPlanList: false,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true
})); }));
onPlanInfoClear();
}; };
//Сброс выбора плана //Сброс выбора плана
const unselectPlan = () => { const unselectPlan = () =>
setPlans(pv => ({ setState(pv => ({
...pv, ...pv,
selected: {}, showIncomeFromDeps: null,
showPlanList: false showFcroutelst: null,
selectedPlan: {},
showPlanList: false,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true
})); }));
onPlanInfoClear();
};
//Обработка нажатия на элемент в списке планов //Обработка нажатия на элемент в списке планов
const handlePlanClick = plan => { const handlePlanClick = plan => {
if (plans.selected.NRN != plan.NRN) selectPlan(plan); if (state.selectedPlan.NRN != plan.NRN) selectPlan(plan);
else unselectPlan(); else unselectPlan();
}; };
//При изменении состояния сортировки информации плана //При изменении состояния сортировки
const handlePlanInfoOrderChanged = ({ orders }) => onPlanInfoOrderChanged({ orders }); const handleOrderChanged = ({ orders }) => setState(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
//При изменении количества отображаемых страниц информации плана //При изменении количества отображаемых страниц
const handlePlanInfoPagesCountChanged = () => onPlanInfoPagesCountChanged(); const handlePagesCountChanged = () => setState(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
//При нажатии на "Заказ" //При нажатии на "Заказ"
const handleProdOrderClick = planSp => { const handleProdOrderClick = planSp => {
setPlanInfo(pv => ({ ...pv, showIncomeFromDeps: planSp })); setState(pv => ({ ...pv, showIncomeFromDeps: planSp }));
}; };
//При нажатии на "Обозначение" //При нажатии на "Обозначение"
const handleMatresCodeClick = planSp => { const handleMatresCodeClick = planSp => {
setPlanInfo(pv => ({ ...pv, showFcroutelst: planSp })); setState(pv => ({ ...pv, showFcroutelst: planSp }));
}; };
//При изменении фильтров
const handleFilterChange = e =>
setFilter(pv => ({ ...pv, [e.target.name]: e.target.name === SFIELD_MONTH && !e.target.value ? getCurrentYearMonth() : e.target.value }));
//Генерация содержимого //Генерация содержимого
return ( return (
<Box p={2}> <Box p={2}>
<Fab variant="extended" sx={STYLES.PLANS_BUTTON} onClick={() => setPlans(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> <Fab variant="extended" sx={STYLES.PLANS_BUTTON} onClick={() => setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}>
Планы Планы
</Fab> </Fab>
<Drawer <Drawer
anchor={"left"} anchor={"left"}
open={plans.showPlanList} open={state.showPlanList}
onClose={() => setPlans(pv => ({ ...pv, showPlanList: false }))} onClose={() => setState(pv => ({ ...pv, showPlanList: false }))}
sx={STYLES.PLANS_DRAWER} sx={STYLES.PLANS_DRAWER}
> >
<PlanList <PlanList
plans={filteredPlanCtgls} plans={filteredPlanCtgls}
selectedPlan={plans.selected} selectedPlan={state.selectedPlan}
filter={filter} filter={filter}
onFilterChange={handleFilterChange} setFilter={setFilter}
onClick={handlePlanClick} onClick={handlePlanClick}
/> />
</Drawer> </Drawer>
<Grid container> <Grid container>
<Grid item xs={12}> <Grid item xs={12}>
<Box display="flex" justifyContent="center" alignItems="center"> <Box display="flex" justifyContent="center" alignItems="center">
{planInfo.dataLoaded ? ( {state.dataLoaded ? (
planInfo.rows.length === 0 ? ( state.rows.length === 0 ? (
<InlineMsgInfo okBtn={false} text={"В плане отсутствуют записи спецификации"} /> <InlineMsgInfo okBtn={false} text={"В плане отсутствуют записи спецификации"} />
) : ( ) : (
<Box sx={STYLES.CONTAINER}> <Box sx={STYLES.CONTAINER}>
<Typography sx={STYLES.TITLE} variant={"h6"}> <Typography sx={STYLES.TITLE} variant={"h6"}>
{`Производственный план цеха №${plans.selected.SSUBDIV} на ${plans.selected.SPERIOD}`} {`Производственный план цеха №${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`}
</Typography> </Typography>
<Box> <Box>
<P8PDataGrid <P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS} {...P8P_DATA_GRID_CONFIG_PROPS}
containerComponentProps={{ elevation: 6, sx: STYLES.DATA_GRID_CONTAINER }} containerComponentProps={{ elevation: 6, sx: STYLES.DATA_GRID_CONTAINER }}
fixedHeader={planInfo.fixedHeader} fixedHeader={state.fixedHeader}
fixedColumns={planInfo.fixedColumns} fixedColumns={state.fixedColumns}
columnsDef={planInfo.columnsDef} columnsDef={state.columnsDef}
rows={planInfo.rows} rows={state.rows}
size={P8P_DATA_GRID_SIZE.MEDIUM} size={P8P_DATA_GRID_SIZE.MEDIUM}
morePages={planInfo.morePages} morePages={state.morePages}
reloading={planInfo.reload} reloading={state.reload}
onOrderChanged={handlePlanInfoOrderChanged} onOrderChanged={handleOrderChanged}
onPagesCountChanged={handlePlanInfoPagesCountChanged} onPagesCountChanged={handlePagesCountChanged}
dataCellRender={prms => dataCellRender={prms => dataCellRender({ ...prms, handleProdOrderClick, handleMatresCodeClick })}
dataCellRender({
...prms,
onProdOrderClick: handleProdOrderClick,
onMatresCodeClick: handleMatresCodeClick
})
}
groupCellRender={groupCellRender} groupCellRender={groupCellRender}
/> />
</Box> </Box>
</Box> </Box>
) )
) : !plans.selected.NRN ? ( ) : !state.selectedPlan.NRN ? (
<InlineMsgInfo okBtn={false} text={"Укажите план для отображения спецификаций"} /> <InlineMsgInfo okBtn={false} text={"Укажите план для отображения спецификаций"} />
) : null} ) : null}
</Box> </Box>
</Grid> </Grid>
</Grid> </Grid>
{planInfo.showIncomeFromDeps ? ( {state.showIncomeFromDeps ? (
<IncomFromDepsDataGridDialog task={planInfo.showIncomeFromDeps} onClose={() => handleProdOrderClick(null)} /> <IncomFromDepsDataGridDialog task={state.showIncomeFromDeps} onClose={() => handleProdOrderClick(null)} />
) : null}
{planInfo.showFcroutelst ? (
<CostRouteListsDataGridDialog task={planInfo.showFcroutelst} onClose={() => handleMatresCodeClick(null)} />
) : null} ) : null}
{state.showFcroutelst ? <CostRouteListsDataGridDialog task={state.showFcroutelst} onClose={() => handleMatresCodeClick(null)} /> : null}
</Box> </Box>
); );
}; };

View File

@ -150,8 +150,7 @@ create or replace package PKG_P8PANELS_MECHREC as
/* Инициализация записей раздела "Планы и отчеты производства изделий" */ /* Инициализация записей раздела "Планы и отчеты производства изделий" */
procedure FCPRODPLAN_DEPT_INIT procedure FCPRODPLAN_DEPT_INIT
( (
SMONTH in varchar2, -- Месяц отбора (в формате "YYYY-MM") COUT out clob -- Список записей раздела "Планы и отчеты производства изделий"
COUT out clob -- Список записей раздела "Планы и отчеты производства изделий"
); );
/* Выдать задания сменного задания */ /* Выдать задания сменного задания */
@ -4317,7 +4316,6 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Инициализация записей раздела "Планы и отчеты производства изделий" */ /* Инициализация записей раздела "Планы и отчеты производства изделий" */
procedure FCPRODPLAN_DEPT_INIT procedure FCPRODPLAN_DEPT_INIT
( (
SMONTH in varchar2, -- Месяц отбора (в формате "YYYY-MM")
COUT out clob -- Список записей раздела "Планы и отчеты производства изделий" COUT out clob -- Список записей раздела "Планы и отчеты производства изделий"
) )
is is
@ -4329,7 +4327,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Считываем версию контрагентов */ /* Считываем версию контрагентов */
FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION); FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
/* Определяем период записей */ /* Определяем период записей */
P_FIRST_LAST_DAY(DCALCDATE => TO_DATE(SMONTH, 'yyyy-mm'), DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO); P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
/* Начинаем формирование XML */ /* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */ /* Открываем корень */

4
dist/p8-panels.js vendored

File diff suppressed because one or more lines are too long