342 lines
13 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.

//---------------------
//Подключение библиотек
//---------------------
import { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
//---------
//Константы
//---------
//Размер страницы данных
const DATA_GRID_PAGE_SIZE = 10;
//-----------
//Тело модуля
//-----------
//Хук для основной таблицы панели
const useMechRecAssemblyMon = () => {
//Собственное состояние
let [state, setState] = useState({
init: false,
showPlanList: false,
planCtlgs: [],
planCtlgsLoaded: false,
selectedPlanCtlg: { NRN: null, SNAME: null, NMIN_YEAR: null, NMAX_YEAR: null },
plans: [],
plansLoaded: false,
selectedPlan: { NRN: null, SNUMB: null, NPROGRESS: null, SDETAIL: null, NYEAR: null }
});
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Инициализация каталогов планов
const initPlanCtlgs = useCallback(async () => {
if (!state.init) {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_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, plans: [...(data?.XFCPRODPLAN_INFO || [])], plansLoaded: true }));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
},
[executeStored]
);
//Выбор каталога планов
const selectPlan = project => {
setState(pv => ({
...pv,
selectedPlanCtlg: project,
showPlanList: false
}));
};
//Сброс выбора каталога планов
const unselectPlan = () =>
setState(pv => ({
...pv,
selectedPlanCtlg: { NRN: null, SNAME: null, NMIN_YEAR: null, NMAX_YEAR: null },
showPlanList: false
}));
//При подключении компонента к странице
useEffect(() => {
initPlanCtlgs();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
//При изменении каталога
useEffect(() => {
//Если каталог выбран
if (state.selectedPlanCtlg) {
loadPlans(state.selectedPlanCtlg.NRN);
} else {
setState(pv => ({ ...pv, plans: [], plansLoaded: false }));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [state.selectedPlanCtlg]);
return [state, setState, selectPlan, unselectPlan];
};
//Хук для информации по производственным составам
const useCostProductComposition = nProdPlan => {
//Собственное состояние
let [costProductComposition, setCostProductComposition] = useState({
init: false,
showPlanList: false,
products: [],
selectedProduct: null
});
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Инициализация производственных составов
const initCostProductComposition = useCallback(async () => {
if (!costProductComposition.init) {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODCMP_DETAILS_GET",
args: { NFCPRODPLAN: nProdPlan },
respArg: "COUT",
isArray: name => name === "XFCPRODCMP"
});
setCostProductComposition(pv => ({ ...pv, init: true, products: [...(data?.XFCPRODCMP || [])], productsLoaded: true }));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [costProductComposition.init, executeStored]);
//При подключении компонента к странице
useEffect(() => {
initCostProductComposition();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return [costProductComposition, setCostProductComposition];
};
//Хук для таблицы маршрутных листов
const useCostRouteLists = (plan, product) => {
//Собственное состояние - таблица данных
const [costRouteLists, setCostRouteLists] = useState({
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true,
selectedProduct: null
});
//Подключение к контексту взаимодействия с сервером
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Загрузка данных таблицы с сервера
const loadData = useCallback(
async () => {
if (costRouteLists.reload) {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCROUTLST_MON_DG_GET",
args: {
NPRODCMPSP: product,
NFCPRODPLAN: plan,
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.orders, costRouteLists.dataLoaded, costRouteLists.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]
);
//При изменении продукта
useEffect(() => {
//Если продукт указан
if (product) {
//Принудительно обновляем состояние
setCostRouteLists(pv => ({
...pv,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true,
selectedProduct: null
}));
//Загружаем данные с учетом выбранного продукта
loadData();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [product]);
//При необходимости обновить данные таблицы
useEffect(() => {
//Если продукт указан и необходимо стандартное обновление
if (product) {
loadData();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [costRouteLists.reload, loadData]);
//При изменении плана
useEffect(() => {
setCostRouteLists(pv => ({
...pv,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true,
selectedProduct: null
}));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [plan]);
return [costRouteLists, setCostRouteLists];
};
//Хук для таблицы комплектовочных ведомостей
const useCostDeliverySheets = (plan, product) => {
//Собственное состояние - таблица данных
const [costDeliverySheets, setCostDeliverySheets] = useState({
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true,
selectedProduct: null
});
//Подключение к контексту взаимодействия с сервером
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Загрузка данных таблицы с сервера
const loadData = useCallback(
async () => {
if (costDeliverySheets.reload) {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCDELIVSH_DG_GET",
args: {
NPRODCMPSP: product,
NFCPRODPLAN: plan,
CORDERS: { VALUE: object2Base64XML(costDeliverySheets.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: costDeliverySheets.pageNumber,
NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
NINCLUDE_DEF: costDeliverySheets.dataLoaded ? 0 : 1
},
respArg: "COUT"
});
setCostDeliverySheets(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
[
costDeliverySheets.reload,
costDeliverySheets.orders,
costDeliverySheets.dataLoaded,
costDeliverySheets.pageNumber,
executeStored,
SERV_DATA_TYPE_CLOB
]
);
//При изменении продукта
useEffect(() => {
//Если продукт указан
if (product) {
//Принудительно обновляем состояние
setCostDeliverySheets(pv => ({
...pv,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true
}));
//Загружаем данные с учетом выбранного продукта
loadData();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [product]);
//При необходимости обновить данные таблицы
useEffect(() => {
//Если продукт указан и необходимо стандартное обновление
if (product) {
loadData();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [costDeliverySheets.reload, loadData]);
//При изменении плана
useEffect(() => {
setCostDeliverySheets(pv => ({
...pv,
dataLoaded: false,
columnsDef: [],
orders: null,
rows: [],
reload: true,
pageNumber: 1,
morePages: true,
selectedProduct: null
}));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [plan]);
return [costDeliverySheets, setCostDeliverySheets];
};
export { useMechRecAssemblyMon, useCostProductComposition, useCostRouteLists, useCostDeliverySheets };