216 lines
7.9 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 { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
//---------
//Константы
//---------
//Размер страницы данных
const DATA_GRID_PAGE_SIZE = 5;
//-----------
//Тело модуля
//-----------
//Клиентский отбор каталогов по поисковой фразе и наличию планов
export const useFilteredPlanCtlgs = (planCtlgs, filter) => {
const filteredPlanCtlgs = React.useMemo(() => {
return planCtlgs.filter(
catalog =>
catalog.SNAME.toString().toLowerCase().includes(filter.ctlgName) &&
(filter.haveDocs ? catalog.NCOUNT_DOCS > 0 : catalog.NCOUNT_DOCS >= 0)
);
}, [planCtlgs, filter]);
return filteredPlanCtlgs;
};
//Хук для основной таблицы панели
const useMechRecAssemblyMon = () => {
//Собственное состояние
let [state, setState] = useState({
init: false,
showPlanList: false,
planCtlgs: [],
planCtlgsLoaded: false,
selectedPlanCtlg: {},
planSpecs: [],
planSpecsLoaded: false,
selectedPlanSpec: {}
});
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Инициализация каталогов планов
const initPlanCtlgs = useCallback(async () => {
if (!state.init) {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_AM_CTLG_INIT",
args: {},
respArg: "COUT",
isArray: name => name === "XFCPRODPLAN_CRNS"
});
setState(pv => ({ ...pv, init: true, planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])], planCtlgsLoaded: true }));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [state.init, executeStored]);
//Получение информации о планах каталога
const loadPlans = useCallback(
async NCRN => {
if (NCRN) {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_GET",
args: { NCRN: NCRN },
respArg: "COUT",
isArray: name => name === "XFCPRODPLAN_INFO"
});
setState(pv => ({ ...pv, init: true, planSpecs: [...(data?.XFCPRODPLAN_INFO || [])], planSpecsLoaded: true }));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
},
[executeStored]
);
//Выбор каталога планов
const selectPlanCtlg = planCtlg => {
setState(pv => ({
...pv,
selectedPlanCtlg: { ...planCtlg },
selectedPlanSpec: {},
showPlanList: false
}));
};
//Сброс выбора каталога планов
const unselectPlanCtlg = () =>
setState(pv => ({
...pv,
selectedPlanCtlg: {},
selectedPlanSpec: {},
showPlanList: false
}));
//При подключении компонента к странице
useEffect(() => {
initPlanCtlgs();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
//При изменении каталога
useEffect(() => {
//Если каталог выбран
if (state.selectedPlanCtlg) {
loadPlans(state.selectedPlanCtlg.NRN);
} else {
setState(pv => ({ ...pv, planSpecs: [], planSpecsLoaded: false }));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [state.selectedPlanCtlg]);
return [state, setState, selectPlanCtlg, unselectPlanCtlg];
};
//Хук для информации по производственным составам
const useCostProductComposition = planSpec => {
//Собственное состояние
let [costProductComposition, setCostProductComposition] = useState({
showPlanList: false,
products: [],
productsLoaded: false,
model: null,
selectedProduct: null
});
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//При подключении компонента к странице
useEffect(() => {
const loadData = async () => {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODCMP_DETAILS_GET",
args: { NFCPRODPLANSP: planSpec },
respArg: "COUT",
isArray: name => name === "XFCPRODCMP"
});
setCostProductComposition(pv => ({
...pv,
products: [...(data?.XFCPRODCMP || [])],
productsLoaded: true,
model: data?.BMODEL,
selectedProduct: null
}));
};
if (planSpec) loadData();
}, [planSpec, executeStored]);
//Вернём данные
return [costProductComposition, setCostProductComposition];
};
//Хук для таблицы детализации изделия
const useProductDetailsTable = (planSpec, product, orders, pageNumber, stored) => {
//Собственное состояние - флаг загрузки
const [isLoading, setLoading] = useState(false);
//Собственное состояние - таблица данных
const [data, setData] = useState({
init: false,
columnsDef: [],
rows: [],
morePages: true
});
//Подключение к контексту взаимодействия с сервером
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Загрузка данных при изменении зависимостей
useEffect(() => {
const loadData = async () => {
try {
setLoading(true);
const data = await executeStored({
stored,
args: {
NFCPRODPLANSP: planSpec,
CORDERS: { VALUE: object2Base64XML(orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: pageNumber,
NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
NINCLUDE_DEF: pageNumber == 1 ? 1 : 0
},
respArg: "COUT",
loader: false
});
setData(pv => ({
...pv,
...data.XDATA_GRID,
columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,
rows: pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],
morePages: DATA_GRID_PAGE_SIZE == 0 ? false : (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE,
init: true
}));
} finally {
setLoading(false);
}
};
if (planSpec && product) loadData();
}, [planSpec, product, orders, pageNumber, stored, executeStored, SERV_DATA_TYPE_CLOB]);
//Вернём данные
return { data, isLoading };
};
export { useMechRecAssemblyMon, useCostProductComposition, useProductDetailsTable };