Исправлено отображение подразделения при отборе, открытие ссылок таблицы в новой вкладке

This commit is contained in:
Dollerino 2026-04-13 17:18:39 +03:00
parent 199d27fe14
commit a277d780bf
11 changed files with 165 additions and 52 deletions

View File

@ -79,7 +79,11 @@ const Filter = ({ filter, onFilterOpen }) => {
<Stack direction="row" spacing={1} alignItems={"center"} sx={STYLES.FILTERS_STACK}> <Stack direction="row" spacing={1} alignItems={"center"} sx={STYLES.FILTERS_STACK}>
{filter.dDate ? <FilterItem caption={"На дату"} value={formatDateRF(filter.dDate)} onClick={handleClick} /> : null} {filter.dDate ? <FilterItem caption={"На дату"} value={formatDateRF(filter.dDate)} onClick={handleClick} /> : null}
{filter.sCustomerDept ? ( {filter.sCustomerDept ? (
<FilterItem caption={"Транспортный участок"} value={filter.sCustomerDept} onClick={handleClick} /> <FilterItem
caption={"Транспортный участок"}
value={`${filter.sCustomerDeptName} (${filter.sCustomerDept})`}
onClick={handleClick}
/>
) : null} ) : null}
{filter.dDateKOAFrom ? ( {filter.dDateKOAFrom ? (
<FilterItem caption="КОА с" value={formatDateTimeRF(filter.dDateKOAFrom)} onClick={handleClick} /> <FilterItem caption="КОА с" value={formatDateTimeRF(filter.dDateKOAFrom)} onClick={handleClick} />

View File

@ -10,7 +10,7 @@
import React, { useState } from "react"; //Классы React import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, Box, TextField, InputAdornment } from "@mui/material"; //Интерфейсные компоненты import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, Box, TextField, InputAdornment } from "@mui/material"; //Интерфейсные компоненты
import { useDictionary } from "./hooks/dict_hooks"; //Хуки открытий разделов import { useDictionary, useProcedures } from "./hooks/dict_hooks"; //Хуки открытий разделов
import { hasValue, formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции import { hasValue, formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции
//--------- //---------
@ -52,15 +52,20 @@ const FilterDialog = ({ initial, isFiltersInit, onCancel, onOk }) => {
//Вспомогательные функции открытия раздела //Вспомогательные функции открытия раздела
const { handleInsDepartmentOpen } = useDictionary(); const { handleInsDepartmentOpen } = useDictionary();
//Вспомогательные функции
const { handleInsDepartmentNameGet } = useProcedures();
//Отработка воода значения в фильтр //Отработка воода значения в фильтр
const handleValueChanged = e => setFilter(pv => ({ ...pv, [e.target.name]: e.target.value })); const handleValueChanged = e => {
setFilter(pv => ({ ...pv, [e.target.name]: e.target.value, ...(e.target.name === "sCustomerDept" ? { sCustomerDeptName: "" } : {}) }));
};
//При изменении каталога фильтра //При изменении каталога фильтра
const handleCustomerDeptSelect = () => const handleCustomerDeptSelect = () =>
handleInsDepartmentOpen({ handleInsDepartmentOpen({
sCode: filter.sCustomerDept, sCode: filter.sCustomerDept,
callBack: res => { callBack: res => {
setFilter(pv => ({ ...pv, sCustomerDept: res.outParameters.out_CODE })); setFilter(pv => ({ ...pv, sCustomerDept: res.outParameters.out_CODE, sCustomerDeptName: res.outParameters.out_NAME }));
} }
}); });
@ -74,14 +79,25 @@ const FilterDialog = ({ initial, isFiltersInit, onCancel, onOk }) => {
//При очистке фильтра //При очистке фильтра
const handleClear = () => { const handleClear = () => {
setFilter({ dDate: "", sCustomerDept: "", dDateKOAFrom: "", dDateKOATo: "" }); setFilter({ dDate: "", sCustomerDept: "", sCustomerDeptName: "", dDateKOAFrom: "", dDateKOATo: "" });
}; };
//При закрытии диалога без изменения фильтра //При закрытии диалога без изменения фильтра
const handleCancel = () => (isActionAllow(initial, isFiltersInit) ? onCancel && onCancel() : null); const handleCancel = () => (isActionAllow(initial, isFiltersInit) ? onCancel && onCancel() : null);
//При закрытии диалога с изменением фильтра //При закрытии диалога с изменением фильтра
const handleOK = () => (isActionAllow(filter) && onOk ? onOk(filter) : null); const handleOK = async () => {
let filterRes = { ...filter };
//Если наименование подразделения пустое
if (!filterRes.sCustomerDeptName) {
//Если мнемокоды подразделений совпадают
filterRes.sCustomerDeptName =
filterRes.sCustomerDept === initial.sCustomerDept
? initial.sCustomerDeptName
: await handleInsDepartmentNameGet({ code: filterRes.sCustomerDept });
}
isActionAllow(filterRes) && onOk ? onOk(filterRes) : null;
};
//Генерация содержимого //Генерация содержимого
return ( return (

View File

@ -9,6 +9,7 @@
import { useContext, useCallback } from "react"; //Классы React import { useContext, useCallback } from "react"; //Классы React
import { ApplicationСtx } from "../../../context/application"; //Контекст приложения import { ApplicationСtx } from "../../../context/application"; //Контекст приложения
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
//----------- //-----------
//Тело модуля //Тело модуля
@ -17,7 +18,7 @@ import { ApplicationСtx } from "../../../context/application"; //Контекс
//Состояние открытия разделов //Состояние открытия разделов
const useDictionary = () => { const useDictionary = () => {
//Подключение к контексту приложения //Подключение к контексту приложения
const { pOnlineShowDictionary } = useContext(ApplicationСtx); const { pOnlineShowDictionary, pOnlineShowUnit } = useContext(ApplicationСtx);
//Отображение раздела "Штатные подразделения" //Отображение раздела "Штатные подразделения"
const handleInsDepartmentOpen = useCallback( const handleInsDepartmentOpen = useCallback(
@ -64,29 +65,40 @@ const useDictionary = () => {
//Отображение раздела "Ремонтные ведомости" //Отображение раздела "Ремонтные ведомости"
const handleEquipRepairSheetsOpen = useCallback( const handleEquipRepairSheetsOpen = useCallback(
async prms => { async prms => {
pOnlineShowDictionary({ // pOnlineShowDictionary({
// unitCode: "EquipRepairSheets",
// inputParameters: [{ name: "in_RN", value: prms.nRn }],
// callBack: res => {
// res.success ? prms.callBack(res) : null;
// }
// });
pOnlineShowUnit({
unitCode: "EquipRepairSheets", unitCode: "EquipRepairSheets",
inputParameters: [{ name: "in_RN", value: prms.nRn }], inputParameters: [{ name: "in_RN", value: prms.nRn }],
callBack: res => { modal: false
res.success ? prms.callBack(res) : null;
}
}); });
}, },
[pOnlineShowDictionary] [pOnlineShowUnit]
); );
//Отображение раздела "Картотека АТС" //Отображение раздела "Картотека АТС"
const handleHaulerUnitsCardsOpen = useCallback( const handleHaulerUnitsCardsOpen = useCallback(
async prms => { async prms => {
pOnlineShowDictionary({ // pOnlineShowDictionary({
// unitCode: "HaulerUnitsCards",
// inputParameters: [{ name: "in_RN", value: prms.nRn }],
// callBack: res => {
// res.success ? prms.callBack(res) : null;
// }
// });
pOnlineShowUnit({
unitCode: "HaulerUnitsCards", unitCode: "HaulerUnitsCards",
inputParameters: [{ name: "in_RN", value: prms.nRn }], inputParameters: [{ name: "in_RN", value: prms.nRn }],
callBack: res => { modal: false
res.success ? prms.callBack(res) : null;
}
}); });
}, },
[pOnlineShowDictionary] [pOnlineShowUnit]
); );
//Возвращаем функции открытия разделов //Возвращаем функции открытия разделов
@ -99,8 +111,31 @@ const useDictionary = () => {
}; };
}; };
//Состояние дополнительных общих процедур
const useProcedures = () => {
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Считывание наименования подразделения по мнемокоду
const handleInsDepartmentNameGet = useCallback(
async prms => {
//Считываем наименование подразделения
const departmentName = await executeStored({
stored: "UDO_PKG_P8PANELS_HAULER_ANL.GET_INS_DEPARTMENT_NAME",
args: { SCODE: prms.code }
});
//Возвращаем наименование подразделения
return departmentName.SNAME;
},
[executeStored]
);
//Возвращаем дополнительные функции
return { handleInsDepartmentNameGet };
};
//---------------- //----------------
//Интерфейс модуля //Интерфейс модуля
//---------------- //----------------
export { useDictionary }; export { useDictionary, useProcedures };

View File

@ -22,6 +22,7 @@ const useFilters = () => {
loaded: false, loaded: false,
dDate: "", dDate: "",
sCustomerDept: "", sCustomerDept: "",
sCustomerDeptName: "",
dDateKOAFrom: "", dDateKOAFrom: "",
dDateKOATo: "" dDateKOATo: ""
}); });

View File

@ -75,7 +75,7 @@ const useChartCalcs = ({ storedArgs = {} }) => {
const loadChart = async () => { const loadChart = async () => {
try { try {
const chart = await executeStored({ const chart = await executeStored({
stored: "UDO_PKG_P8PANELS_HAULER_ANL.CHART_ATC_KGT_KOA", stored: "UDO_PKG_P8PANELS_HAULER_ANL.CHART_ATC_KTG_KOA",
args: { args: {
SDEPARTMENT: storedArgs.sCustomerDept || storedArgs.sDepartment, SDEPARTMENT: storedArgs.sCustomerDept || storedArgs.sDepartment,
DDATE_KOA_FROM: storedArgs.dDateKOAFrom ? new Date(storedArgs.dDateKOAFrom) : null, DDATE_KOA_FROM: storedArgs.dDateKOAFrom ? new Date(storedArgs.dDateKOAFrom) : null,

File diff suppressed because one or more lines are too long

View File

@ -16,8 +16,8 @@
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowEqsPanelsRoot" caption="Панели мониторинга" url="Modules/P8-Panels/"/> <MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowEqsPanelsRoot" caption="Панели мониторинга" url="Modules/P8-Panels/"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" separator="true"/> <MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" separator="true"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowEqsPrfrm" caption="Выполнение работ по ТОиР" panelName="EqsPrfrm"/> <MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowEqsPrfrm" caption="Выполнение работ по ТОиР" panelName="EqsPrfrm"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowRepairAnlATC" caption="Аналитика по ремонтам АТС" panelName="RepairAnlATC"/> <MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowEqsRepairAnlATC" caption="Аналитика по ремонтам АТС" panelName="RepairAnlATC"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowHaulerAnl" caption="Гаражка" panelName="HaulerAnl"/> <MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowEqsHaulerAnl" caption="Гаражка" panelName="HaulerAnl"/>
</App> </App>
<App name="MechanicalRecords"> <App name="MechanicalRecords">
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" separator="true"/> <MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" separator="true"/>
@ -36,6 +36,12 @@
<MenuItem parent="{CA9A9853-AC90-412A-85B1-E39927147846}" separator="true"/> <MenuItem parent="{CA9A9853-AC90-412A-85B1-E39927147846}" separator="true"/>
<MenuItem parent="{CA9A9853-AC90-412A-85B1-E39927147846}" name="ShowClntTaskBoard" caption="Доски задач" panelName="ClntTaskBoard"/> <MenuItem parent="{CA9A9853-AC90-412A-85B1-E39927147846}" name="ShowClntTaskBoard" caption="Доски задач" panelName="ClntTaskBoard"/>
</App> </App>
<App name="Hauler">
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" separator="true"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowHaulerPanelsRoot" caption="Панели мониторинга" url="Modules/P8-Panels/"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" separator="true"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowHaulerHaulerAnl" caption="Гаражка" panelName="HaulerAnl"/>
</App>
</MenuItems> </MenuItems>
<Panels urlBase="Modules/P8-Panels/#/"> <Panels urlBase="Modules/P8-Panels/#/">
<Panel <Panel

View File

@ -80,7 +80,11 @@ const Filter = ({ filter, onFilterOpen }) => {
{filter.dDateBegin ? <FilterItem caption={"Дата с"} value={formatDateRF(filter.dDateBegin)} onClick={handleClick} /> : null} {filter.dDateBegin ? <FilterItem caption={"Дата с"} value={formatDateRF(filter.dDateBegin)} onClick={handleClick} /> : null}
{filter.dDateEnd ? <FilterItem caption={"Дата по"} value={formatDateRF(filter.dDateEnd)} onClick={handleClick} /> : null} {filter.dDateEnd ? <FilterItem caption={"Дата по"} value={formatDateRF(filter.dDateEnd)} onClick={handleClick} /> : null}
{filter.sCustomerDept ? ( {filter.sCustomerDept ? (
<FilterItem caption={"Транспортный участок"} value={filter.sCustomerDept} onClick={handleClick} /> <FilterItem
caption={"Транспортный участок"}
value={`${filter.sCustomerDeptName} (${filter.sCustomerDept})`}
onClick={handleClick}
/>
) : null} ) : null}
{filter.sWorkType ? <FilterItem caption={"Типовая работа"} value={filter.sWorkType} onClick={handleClick} /> : null} {filter.sWorkType ? <FilterItem caption={"Типовая работа"} value={filter.sWorkType} onClick={handleClick} /> : null}
{filter.sWorkKind ? <FilterItem caption={"Вид типовых работ"} value={filter.sWorkKind} onClick={handleClick} /> : null} {filter.sWorkKind ? <FilterItem caption={"Вид типовых работ"} value={filter.sWorkKind} onClick={handleClick} /> : null}

View File

@ -10,7 +10,7 @@
import React, { useState } from "react"; //Классы React import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, Box, TextField, InputAdornment } from "@mui/material"; //Интерфейсные компоненты import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, Box, TextField, InputAdornment } from "@mui/material"; //Интерфейсные компоненты
import { useDictionary } from "./hooks/dict_hooks"; //Хуки открытий разделов import { useDictionary, useProcedures } from "./hooks/dict_hooks"; //Хуки открытий разделов
import { hasValue } from "../../core/utils"; //Вспомогательные функции import { hasValue } from "../../core/utils"; //Вспомогательные функции
//--------- //---------
@ -50,15 +50,20 @@ const FilterDialog = ({ initial, isFiltersInit, onCancel, onOk }) => {
//Вспомогательные функции открытия раздела //Вспомогательные функции открытия раздела
const { handleInsDepartmentOpen, handleEquipTypeWorksOpen, handleEquipWorkKindsOpen } = useDictionary(); const { handleInsDepartmentOpen, handleEquipTypeWorksOpen, handleEquipWorkKindsOpen } = useDictionary();
//Вспомогательные функции
const { handleInsDepartmentNameGet } = useProcedures();
//Отработка воода значения в фильтр //Отработка воода значения в фильтр
const handleValueChanged = e => setFilter(pv => ({ ...pv, [e.target.name]: e.target.value })); const handleValueChanged = e => {
setFilter(pv => ({ ...pv, [e.target.name]: e.target.value, ...(e.target.name === "sCustomerDept" ? { sCustomerDeptName: "" } : {}) }));
};
//При изменении каталога фильтра //При изменении каталога фильтра
const handleCustomerDeptSelect = () => const handleCustomerDeptSelect = () =>
handleInsDepartmentOpen({ handleInsDepartmentOpen({
sCode: filter.sCustomerDept, sCode: filter.sCustomerDept,
callBack: res => { callBack: res => {
setFilter(pv => ({ ...pv, sCustomerDept: res.outParameters.out_CODE })); setFilter(pv => ({ ...pv, sCustomerDept: res.outParameters.out_CODE, sCustomerDeptName: res.outParameters.out_NAME }));
} }
}); });
@ -82,14 +87,25 @@ const FilterDialog = ({ initial, isFiltersInit, onCancel, onOk }) => {
//При очистке фильтра //При очистке фильтра
const handleClear = () => { const handleClear = () => {
setFilter({ dDateBegin: "", dDateEnd: "", sCustomerDept: "", sWorkType: "", sWorkKind: "" }); setFilter({ dDateBegin: "", dDateEnd: "", sCustomerDept: "", sCustomerDeptName: "", sWorkType: "", sWorkKind: "" });
}; };
//При закрытии диалога без изменения фильтра //При закрытии диалога без изменения фильтра
const handleCancel = () => (isActionAllow(initial, isFiltersInit) ? onCancel && onCancel() : null); const handleCancel = () => (isActionAllow(initial, isFiltersInit) ? onCancel && onCancel() : null);
//При закрытии диалога с изменением фильтра //При закрытии диалога с изменением фильтра
const handleOK = () => (isActionAllow(filter) && onOk ? onOk(filter) : null); const handleOK = async () => {
let filterRes = { ...filter };
//Если наименование подразделения пустое
if (!filterRes.sCustomerDeptName) {
//Если мнемокоды подразделений совпадают
filterRes.sCustomerDeptName =
filterRes.sCustomerDept === initial.sCustomerDept
? initial.sCustomerDeptName
: await handleInsDepartmentNameGet({ code: filterRes.sCustomerDept });
}
isActionAllow(filterRes) && onOk ? onOk(filterRes) : null;
};
//Генерация содержимого //Генерация содержимого
return ( return (

View File

@ -9,6 +9,7 @@
import { useContext, useCallback } from "react"; //Классы React import { useContext, useCallback } from "react"; //Классы React
import { ApplicationСtx } from "../../../context/application"; //Контекст приложения import { ApplicationСtx } from "../../../context/application"; //Контекст приложения
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
//----------- //-----------
//Тело модуля //Тело модуля
@ -17,7 +18,7 @@ import { ApplicationСtx } from "../../../context/application"; //Контекс
//Состояние открытия разделов //Состояние открытия разделов
const useDictionary = () => { const useDictionary = () => {
//Подключение к контексту приложения //Подключение к контексту приложения
const { pOnlineShowDictionary } = useContext(ApplicationСtx); const { pOnlineShowDictionary, pOnlineShowUnit } = useContext(ApplicationСtx);
//Отображение раздела "Штатные подразделения" //Отображение раздела "Штатные подразделения"
const handleInsDepartmentOpen = useCallback( const handleInsDepartmentOpen = useCallback(
@ -64,15 +65,21 @@ const useDictionary = () => {
//Отображение раздела "Ремонтные ведомости" //Отображение раздела "Ремонтные ведомости"
const handleEquipRepairSheetsOpen = useCallback( const handleEquipRepairSheetsOpen = useCallback(
async prms => { async prms => {
pOnlineShowDictionary({ // pOnlineShowDictionary({
// unitCode: "EquipRepairSheets",
// inputParameters: [{ name: "in_RN", value: prms.nRn }],
// callBack: res => {
// res.success ? prms.callBack(res) : null;
// }
// });
pOnlineShowUnit({
unitCode: "EquipRepairSheets", unitCode: "EquipRepairSheets",
inputParameters: [{ name: "in_RN", value: prms.nRn }], inputParameters: [{ name: "in_RN", value: prms.nRn }],
callBack: res => { modal: false
res.success ? prms.callBack(res) : null;
}
}); });
}, },
[pOnlineShowDictionary] [pOnlineShowUnit]
); );
//Возвращаем функции открытия разделов //Возвращаем функции открытия разделов
@ -84,8 +91,31 @@ const useDictionary = () => {
}; };
}; };
//Состояние дополнительных общих процедур
const useProcedures = () => {
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Считывание наименования подразделения по мнемокоду
const handleInsDepartmentNameGet = useCallback(
async prms => {
//Считываем наименование подразделения
const departmentName = await executeStored({
stored: "UDO_PKG_P8PANELS_RPR_ANL.GET_INS_DEPARTMENT_NAME",
args: { SCODE: prms.code }
});
//Возвращаем наименование подразделения
return departmentName.SNAME;
},
[executeStored]
);
//Возвращаем дополнительные функции
return { handleInsDepartmentNameGet };
};
//---------------- //----------------
//Интерфейс модуля //Интерфейс модуля
//---------------- //----------------
export { useDictionary }; export { useDictionary, useProcedures };

View File

@ -23,6 +23,7 @@ const useFilters = () => {
dDateBegin: "", dDateBegin: "",
dDateEnd: "", dDateEnd: "",
sCustomerDept: "", sCustomerDept: "",
sCustomerDeptName: "",
sWorkType: "", sWorkType: "",
sWorkKind: "" sWorkKind: ""
}); });