forked from CITKParus/P8-Panels
		
	
		
			
				
	
	
		
			216 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | ||
|     Парус 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 };
 |