merge upstream

This commit is contained in:
Dollerok 2026-02-06 14:25:25 +03:00
commit b24c3c5689
4 changed files with 201 additions and 108 deletions

View File

@ -7,7 +7,7 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React, { useState, useEffect, useContext } from "react"; //Классы React import React, { useState, useEffect, useContext, useCallback } 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,17 +32,60 @@ export const useFilteredPlans = (plans, filter) => {
return filteredPlans; return filteredPlans;
}; };
//Хук для основной таблицы //Хук для планов
const useDeptCostProdPlans = () => { const useDeptCostProdPlans = month => {
//Собственное состояние - таблица данных
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,
@ -57,14 +100,43 @@ const useDeptCostProdPlans = () => {
//Подключение к контексту взаимодействия с сервером //Подключение к контексту взаимодействия с сервером
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: state.selectedPlan.NRN, NFCPRODPLAN: plan.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,
@ -76,6 +148,7 @@ const useDeptCostProdPlans = () => {
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,
@ -83,31 +156,20 @@ const useDeptCostProdPlans = () => {
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) {
//При подключении компонента к странице //Очищаем их
useEffect(() => { handleClear();
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 }, [plan.NRN, state.reload, state.orders, state.pageNumber, state.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB, handleClear]);
}, []);
return [state, setState]; //Возвращаем данные
return [state, setState, handleClear, handleOrderChanged, handlePagesCountChanged];
}; };
//Хук для таблицы маршрутных листов //Хук для таблицы маршрутных листов
@ -164,6 +226,7 @@ const useCostRouteLists = task => {
task task
]); ]);
//Возвращаем данные
return [costRouteLists, setCostRouteLists]; return [costRouteLists, setCostRouteLists];
}; };
@ -223,6 +286,7 @@ const useCostRouteListsSpecs = mainRowRN => {
mainRowRN mainRowRN
]); ]);
//Возвращаем данные
return [costRouteListsSpecs, setCostRouteListsSpecs]; return [costRouteListsSpecs, setCostRouteListsSpecs];
}; };
@ -272,7 +336,8 @@ 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, useCostRouteLists, useCostRouteListsSpecs, useIncomFromDeps }; export { useDeptCostProdPlans, useDeptCostProdPlanInfo, 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 } from "./hooks"; //Вспомогательные хуки import { useDeptCostProdPlans, useFilteredPlans, useDeptCostProdPlanInfo } 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,7 +34,8 @@ const TITLE_PADDING_BOTTOM = "20px";
//Стили //Стили
const STYLES = { const STYLES = {
PLANS_FINDER: { marginTop: "10px", marginLeft: "10px", width: "93%" }, PLANS_FILTER: { paddingTop: "20px", display: "flex", flexDirection: "column", alignItems: "center", gap: "5px" },
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: {
@ -60,10 +61,18 @@ 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,
@ -88,7 +97,7 @@ const getRowBackgroudColor = row => {
}; };
//Генерация заливки строки исходя от значений //Генерация заливки строки исходя от значений
const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCodeClick }) => { const dataCellRender = ({ row, columnDef, onProdOrderClick, onMatresCodeClick }) => {
//Описываем общие свойства //Описываем общие свойства
let cellProps = { title: row[columnDef.name] }; let cellProps = { title: row[columnDef.name] };
//Описываем общий стиль //Описываем общий стиль
@ -127,7 +136,7 @@ const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCode
cellProps, cellProps,
cellStyle, cellStyle,
data: ( data: (
<Link component="button" variant="body2" align="left" underline="hover" onClick={() => handleProdOrderClick(row["NRN"])}> <Link component="button" variant="body2" align="left" underline="hover" onClick={() => onProdOrderClick(row["NRN"])}>
{row[columnDef.name]} {row[columnDef.name]}
</Link> </Link>
) )
@ -139,7 +148,7 @@ const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCode
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={() => handleMatresCodeClick(row["NRN"])}> <Link component="button" variant="body2" align="left" underline="hover" onClick={() => onMatresCodeClick(row["NRN"])}>
{row[columnDef.name]} {row[columnDef.name]}
</Link> </Link>
) )
@ -149,21 +158,38 @@ const dataCellRender = ({ row, columnDef, handleProdOrderClick, handleMatresCode
}; };
//Список каталогов планов //Список каталогов планов
const PlanList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => { const PlanList = ({ plans = [], selectedPlan, filter, onFilterChange, 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="Месяц"
type="month"
value={filter.month}
InputLabelProps={{ shrink: true }}
variant="standard"
fullWidth
onChange={handleFilterChange}
required={true}
></TextField>
<TextField
sx={STYLES.PLANS_FILTER_ITEM}
name="planName"
label="План" label="План"
value={filter.planName} value={filter.planName}
variant="standard" variant="standard"
fullWidth fullWidth
onChange={event => { onChange={handleFilterChange}
setFilter(pv => ({ ...pv, planName: event.target.value }));
}}
></TextField> ></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)}>
@ -181,7 +207,7 @@ PlanList.propTypes = {
selectedPlan: PropTypes.object, selectedPlan: PropTypes.object,
onClick: PropTypes.func, onClick: PropTypes.func,
filter: PropTypes.object, filter: PropTypes.object,
setFilter: PropTypes.func onFilterChange: PropTypes.func
}; };
//----------- //-----------
@ -190,135 +216,135 @@ PlanList.propTypes = {
//Корневая панель производственного плана цеха //Корневая панель производственного плана цеха
const MechRecDeptCostProdPlans = () => { const MechRecDeptCostProdPlans = () => {
//Собственное состояние - таблица данных
const [state, setState] = useDeptCostProdPlans();
//Состояние для фильтра каталогов //Состояние для фильтра каталогов
const [filter, setFilter] = useState({ planName: "" }); const [filter, setFilter] = useState({ planName: "", month: getCurrentYearMonth() });
//Собственное состояние - таблица планов
const [plans, setPlans] = useDeptCostProdPlans(filter.month);
//Собственное состояние - таблица информации
const [planInfo, setPlanInfo, onPlanInfoClear, onPlanInfoOrderChanged, onPlanInfoPagesCountChanged] = useDeptCostProdPlanInfo(plans.selected);
//Массив отфильтрованных каталогов //Массив отфильтрованных каталогов
const filteredPlanCtgls = useFilteredPlans(state.planList, filter); const filteredPlanCtgls = useFilteredPlans(plans.rows, filter);
//Подключение к контексту сообщений //Подключение к контексту сообщений
const { InlineMsgInfo } = useContext(MessagingСtx); const { InlineMsgInfo } = useContext(MessagingСtx);
//Выбор плана //Выбор плана
const selectPlan = plan => { const selectPlan = plan => {
setState(pv => ({ setPlans(pv => ({
...pv, ...pv,
showIncomeFromDeps: null, selected: plan,
showFcroutelst: null, showPlanList: false
selectedPlan: plan,
showPlanList: false,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true
})); }));
onPlanInfoClear();
}; };
//Сброс выбора плана //Сброс выбора плана
const unselectPlan = () => const unselectPlan = () => {
setState(pv => ({ setPlans(pv => ({
...pv, ...pv,
showIncomeFromDeps: null, selected: {},
showFcroutelst: null, showPlanList: false
selectedPlan: {},
showPlanList: false,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true
})); }));
onPlanInfoClear();
};
//Обработка нажатия на элемент в списке планов //Обработка нажатия на элемент в списке планов
const handlePlanClick = plan => { const handlePlanClick = plan => {
if (state.selectedPlan.NRN != plan.NRN) selectPlan(plan); if (plans.selected.NRN != plan.NRN) selectPlan(plan);
else unselectPlan(); else unselectPlan();
}; };
//При изменении состояния сортировки //При изменении состояния сортировки информации плана
const handleOrderChanged = ({ orders }) => setState(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true })); const handlePlanInfoOrderChanged = ({ orders }) => onPlanInfoOrderChanged({ orders });
//При изменении количества отображаемых страниц //При изменении количества отображаемых страниц информации плана
const handlePagesCountChanged = () => setState(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true })); const handlePlanInfoPagesCountChanged = () => onPlanInfoPagesCountChanged();
//При нажатии на "Заказ" //При нажатии на "Заказ"
const handleProdOrderClick = planSp => { const handleProdOrderClick = planSp => {
setState(pv => ({ ...pv, showIncomeFromDeps: planSp })); setPlanInfo(pv => ({ ...pv, showIncomeFromDeps: planSp }));
}; };
//При нажатии на "Обозначение" //При нажатии на "Обозначение"
const handleMatresCodeClick = planSp => { const handleMatresCodeClick = planSp => {
setState(pv => ({ ...pv, showFcroutelst: planSp })); setPlanInfo(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={() => setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}> <Fab variant="extended" sx={STYLES.PLANS_BUTTON} onClick={() => setPlans(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}>
Планы Планы
</Fab> </Fab>
<Drawer <Drawer
anchor={"left"} anchor={"left"}
open={state.showPlanList} open={plans.showPlanList}
onClose={() => setState(pv => ({ ...pv, showPlanList: false }))} onClose={() => setPlans(pv => ({ ...pv, showPlanList: false }))}
sx={STYLES.PLANS_DRAWER} sx={STYLES.PLANS_DRAWER}
> >
<PlanList <PlanList
plans={filteredPlanCtgls} plans={filteredPlanCtgls}
selectedPlan={state.selectedPlan} selectedPlan={plans.selected}
filter={filter} filter={filter}
setFilter={setFilter} onFilterChange={handleFilterChange}
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">
{state.dataLoaded ? ( {planInfo.dataLoaded ? (
state.rows.length === 0 ? ( planInfo.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"}>
{`Производственный план цеха №${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`} {`Производственный план цеха №${plans.selected.SSUBDIV} на ${plans.selected.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={state.fixedHeader} fixedHeader={planInfo.fixedHeader}
fixedColumns={state.fixedColumns} fixedColumns={planInfo.fixedColumns}
columnsDef={state.columnsDef} columnsDef={planInfo.columnsDef}
rows={state.rows} rows={planInfo.rows}
size={P8P_DATA_GRID_SIZE.MEDIUM} size={P8P_DATA_GRID_SIZE.MEDIUM}
morePages={state.morePages} morePages={planInfo.morePages}
reloading={state.reload} reloading={planInfo.reload}
onOrderChanged={handleOrderChanged} onOrderChanged={handlePlanInfoOrderChanged}
onPagesCountChanged={handlePagesCountChanged} onPagesCountChanged={handlePlanInfoPagesCountChanged}
dataCellRender={prms => dataCellRender({ ...prms, handleProdOrderClick, handleMatresCodeClick })} dataCellRender={prms =>
dataCellRender({
...prms,
onProdOrderClick: handleProdOrderClick,
onMatresCodeClick: handleMatresCodeClick
})
}
groupCellRender={groupCellRender} groupCellRender={groupCellRender}
/> />
</Box> </Box>
</Box> </Box>
) )
) : !state.selectedPlan.NRN ? ( ) : !plans.selected.NRN ? (
<InlineMsgInfo okBtn={false} text={"Укажите план для отображения спецификаций"} /> <InlineMsgInfo okBtn={false} text={"Укажите план для отображения спецификаций"} />
) : null} ) : null}
</Box> </Box>
</Grid> </Grid>
</Grid> </Grid>
{state.showIncomeFromDeps ? ( {planInfo.showIncomeFromDeps ? (
<IncomFromDepsDataGridDialog task={state.showIncomeFromDeps} onClose={() => handleProdOrderClick(null)} /> <IncomFromDepsDataGridDialog task={planInfo.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,6 +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 -- Список записей раздела "Планы и отчеты производства изделий"
); );
@ -4316,6 +4317,7 @@ 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
@ -4327,7 +4329,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 => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO); P_FIRST_LAST_DAY(DCALCDATE => TO_DATE(SMONTH, 'yyyy-mm'), 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