forked from CITKParus/P8-Panels
		
	
		
			
				
	
	
		
			199 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | ||
|     Парус 8 - Панели мониторинга - ПУП - Загрузка цеха
 | ||
|     Кастомные хуки
 | ||
| */
 | ||
| 
 | ||
| //---------------------
 | ||
| //Подключение библиотек
 | ||
| //---------------------
 | ||
| 
 | ||
| import { useState, useCallback, useEffect, useContext } from "react"; //Классы React
 | ||
| import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
 | ||
| import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
 | ||
| 
 | ||
| //---------
 | ||
| //Константы
 | ||
| //---------
 | ||
| 
 | ||
| //Размер страницы данных
 | ||
| const DATA_GRID_PAGE_SIZE_SMALL = 5;
 | ||
| const DATA_GRID_PAGE_SIZE_LARGE = 12;
 | ||
| 
 | ||
| //-----------
 | ||
| //Тело модуля
 | ||
| //-----------
 | ||
| 
 | ||
| //Хук для основной таблицы панели
 | ||
| const useMechRecDeptCostJobs = (subdiv, fullDate, workHours) => {
 | ||
|     //Собственное состояние - таблица данных
 | ||
|     const [costJobs, setCostJobs] = useState({
 | ||
|         dataLoaded: false,
 | ||
|         columnsDef: [],
 | ||
|         orders: null,
 | ||
|         rows: [],
 | ||
|         reload: true,
 | ||
|         pageNumber: 1,
 | ||
|         morePages: true,
 | ||
|         fixedHeader: false,
 | ||
|         fixedColumns: 0,
 | ||
|         date: null
 | ||
|     });
 | ||
| 
 | ||
|     //Подключение к контексту взаимодействия с сервером
 | ||
|     const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
 | ||
| 
 | ||
|     //При необходимости обновить данные таблицы
 | ||
|     useEffect(() => {
 | ||
|         //Если указано подразделение и необходимо обновить, либо изменилась дата
 | ||
|         if (subdiv && (costJobs.reload || costJobs.date !== fullDate)) {
 | ||
|             const loadData = async () => {
 | ||
|                 const data = await executeStored({
 | ||
|                     stored: "PKG_P8PANELS_MECHREC.FCJOBS_DEP_LOAD_DG_GET",
 | ||
|                     args: {
 | ||
|                         NSUBDIV: subdiv,
 | ||
|                         SMONTH_YEAR: fullDate,
 | ||
|                         NWORKHOURS: workHours,
 | ||
|                         CORDERS: { VALUE: object2Base64XML(costJobs.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
 | ||
|                         NPAGE_NUMBER: costJobs.pageNumber,
 | ||
|                         NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,
 | ||
|                         NINCLUDE_DEF: 1
 | ||
|                     },
 | ||
|                     respArg: "COUT"
 | ||
|                 });
 | ||
|                 setCostJobs(pv => ({
 | ||
|                     ...pv,
 | ||
|                     fixedHeader: data.XDATA_GRID.fixedHeader,
 | ||
|                     fixedColumns: data.XDATA_GRID.fixedColumns,
 | ||
|                     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_LARGE,
 | ||
|                     date: fullDate
 | ||
|                 }));
 | ||
|             };
 | ||
|             loadData();
 | ||
|         }
 | ||
|     }, [costJobs.reload, subdiv, fullDate, costJobs.date, costJobs.orders, costJobs.pageNumber, executeStored, workHours, SERV_DATA_TYPE_CLOB]);
 | ||
| 
 | ||
|     return [costJobs, setCostJobs];
 | ||
| };
 | ||
| 
 | ||
| //Хук таблицы подразделений цехов
 | ||
| const useInsDepartment = fullDate => {
 | ||
|     //Собственное состояние
 | ||
|     let [insDepartments, setInsDepartments] = useState({
 | ||
|         dataLoaded: false,
 | ||
|         columnsDef: [],
 | ||
|         rows: [],
 | ||
|         reload: true,
 | ||
|         pageNumber: 1,
 | ||
|         morePages: true
 | ||
|     });
 | ||
| 
 | ||
|     //Подключение к контексту взаимодействия с сервером
 | ||
|     const { executeStored } = useContext(BackEndСtx);
 | ||
| 
 | ||
|     //При необходимости обновить данные таблицы
 | ||
|     useEffect(() => {
 | ||
|         const loadData = async () => {
 | ||
|             const data = await executeStored({
 | ||
|                 stored: "PKG_P8PANELS_MECHREC.INS_DEPARTMENT_DG_GET",
 | ||
|                 args: {
 | ||
|                     SMONTH_YEAR: fullDate,
 | ||
|                     NPAGE_SIZE: DATA_GRID_PAGE_SIZE_SMALL,
 | ||
|                     NINCLUDE_DEF: insDepartments.dataLoaded ? 0 : 1
 | ||
|                 },
 | ||
|                 respArg: "COUT",
 | ||
|                 attributeValueProcessor: (name, val) => (["DBGNDATE", "DENDDATE"].includes(name) ? formatDateRF(val) : val)
 | ||
|             });
 | ||
|             setInsDepartments(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_SMALL
 | ||
|             }));
 | ||
|         };
 | ||
|         if (insDepartments.reload) {
 | ||
|             loadData();
 | ||
|         }
 | ||
|     }, [executeStored, fullDate, insDepartments.dataLoaded, insDepartments.reload]);
 | ||
| 
 | ||
|     return [insDepartments, setInsDepartments];
 | ||
| };
 | ||
| 
 | ||
| //Хук для диалога фильтра
 | ||
| const useFilter = (currentMonth, currentYear) => {
 | ||
|     //Собственное состояние - фильтр
 | ||
|     const [filter, setFilter] = useState({
 | ||
|         init: true,
 | ||
|         openedDepartment: false,
 | ||
|         date: {
 | ||
|             month: currentMonth,
 | ||
|             year: currentYear,
 | ||
|             fullDate: currentMonth.toString().padStart(2, "0") + "." + currentYear
 | ||
|         },
 | ||
|         department: { NRN: null, SCODE: "", SNAME: "" },
 | ||
|         workDays: 0,
 | ||
|         workHours: 0,
 | ||
|         totalWorkHours: 0
 | ||
|     });
 | ||
| 
 | ||
|     //Подключение к контексту взаимодействия с сервером
 | ||
|     const { executeStored } = useContext(BackEndСtx);
 | ||
| 
 | ||
|     //Считываем количества рабочих дней
 | ||
|     const getWorkDays = useCallback(
 | ||
|         async ({ newDate, init }) => {
 | ||
|             const data = await executeStored({
 | ||
|                 stored: "PKG_P8PANELS_MECHREC.ENPERIOD_WORKDAYS_GET",
 | ||
|                 args: { SMONTH_YEAR: newDate.fullDate }
 | ||
|             });
 | ||
|             if (init) {
 | ||
|                 setFilter(pv => ({ ...pv, workDays: data.NWORKDAYS, init: false }));
 | ||
|             } else {
 | ||
|                 setFilter(pv => ({
 | ||
|                     ...pv,
 | ||
|                     date: { ...newDate },
 | ||
|                     department: filter.department,
 | ||
|                     workDays: data.NWORKDAYS,
 | ||
|                     totalWorkHours: data.NWORKDAYS * filter.workHours
 | ||
|                 }));
 | ||
|             }
 | ||
|         },
 | ||
|         [executeStored, filter]
 | ||
|     );
 | ||
| 
 | ||
|     //Считываем количество рабочих часов
 | ||
|     const getWorkHours = useCallback(
 | ||
|         async department => {
 | ||
|             const data = await executeStored({
 | ||
|                 stored: "PKG_P8PANELS_MECHREC.INS_DEPARTMENT_WORKHOURS_GET",
 | ||
|                 args: { NSUBDIV: department.NRN }
 | ||
|             });
 | ||
|             setFilter(pv => ({
 | ||
|                 ...pv,
 | ||
|                 openedDepartment: false,
 | ||
|                 department: { ...department },
 | ||
|                 workHours: data.NWORKHOURS,
 | ||
|                 totalWorkHours: Math.round(filter.workDays * data.NWORKHOURS)
 | ||
|             }));
 | ||
|         },
 | ||
|         [executeStored, filter.workDays]
 | ||
|     );
 | ||
| 
 | ||
|     //При необходимости обновить данные таблицы
 | ||
|     useEffect(() => {
 | ||
|         if (filter.init) {
 | ||
|             getWorkDays({ newDate: { month: filter.date.month, year: filter.date.year, fullDate: filter.date.fullDate }, init: filter.init });
 | ||
|         }
 | ||
|         // eslint-disable-next-line react-hooks/exhaustive-deps
 | ||
|     }, [filter.init]);
 | ||
| 
 | ||
|     return [filter, setFilter, getWorkDays, getWorkHours];
 | ||
| };
 | ||
| 
 | ||
| export { useMechRecDeptCostJobs, useInsDepartment, useFilter };
 |