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

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}>
{filter.dDate ? <FilterItem caption={"На дату"} value={formatDateRF(filter.dDate)} onClick={handleClick} /> : null}
{filter.sCustomerDept ? (
<FilterItem caption={"Транспортный участок"} value={filter.sCustomerDept} onClick={handleClick} />
<FilterItem
caption={"Транспортный участок"}
value={`${filter.sCustomerDeptName} (${filter.sCustomerDept})`}
onClick={handleClick}
/>
) : null}
{filter.dDateKOAFrom ? (
<FilterItem caption="КОА с" value={formatDateTimeRF(filter.dDateKOAFrom)} onClick={handleClick} />

View File

@ -10,7 +10,7 @@
import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
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"; //Вспомогательные функции
//---------
@ -52,15 +52,20 @@ const FilterDialog = ({ initial, isFiltersInit, onCancel, onOk }) => {
//Вспомогательные функции открытия раздела
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 = () =>
handleInsDepartmentOpen({
sCode: filter.sCustomerDept,
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 = () => {
setFilter({ dDate: "", sCustomerDept: "", dDateKOAFrom: "", dDateKOATo: "" });
setFilter({ dDate: "", sCustomerDept: "", sCustomerDeptName: "", dDateKOAFrom: "", dDateKOATo: "" });
};
//При закрытии диалога без изменения фильтра
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 (

View File

@ -9,6 +9,7 @@
import { useContext, useCallback } from "react"; //Классы React
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 { pOnlineShowDictionary } = useContext(ApplicationСtx);
const { pOnlineShowDictionary, pOnlineShowUnit } = useContext(ApplicationСtx);
//Отображение раздела "Штатные подразделения"
const handleInsDepartmentOpen = useCallback(
@ -64,29 +65,40 @@ const useDictionary = () => {
//Отображение раздела "Ремонтные ведомости"
const handleEquipRepairSheetsOpen = useCallback(
async prms => {
pOnlineShowDictionary({
// pOnlineShowDictionary({
// unitCode: "EquipRepairSheets",
// inputParameters: [{ name: "in_RN", value: prms.nRn }],
// callBack: res => {
// res.success ? prms.callBack(res) : null;
// }
// });
pOnlineShowUnit({
unitCode: "EquipRepairSheets",
inputParameters: [{ name: "in_RN", value: prms.nRn }],
callBack: res => {
res.success ? prms.callBack(res) : null;
}
modal: false
});
},
[pOnlineShowDictionary]
[pOnlineShowUnit]
);
//Отображение раздела "Картотека АТС"
const handleHaulerUnitsCardsOpen = useCallback(
async prms => {
pOnlineShowDictionary({
// pOnlineShowDictionary({
// unitCode: "HaulerUnitsCards",
// inputParameters: [{ name: "in_RN", value: prms.nRn }],
// callBack: res => {
// res.success ? prms.callBack(res) : null;
// }
// });
pOnlineShowUnit({
unitCode: "HaulerUnitsCards",
inputParameters: [{ name: "in_RN", value: prms.nRn }],
callBack: res => {
res.success ? prms.callBack(res) : null;
}
modal: false
});
},
[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,
dDate: "",
sCustomerDept: "",
sCustomerDeptName: "",
dDateKOAFrom: "",
dDateKOATo: ""
});

View File

@ -75,7 +75,7 @@ const useChartCalcs = ({ storedArgs = {} }) => {
const loadChart = async () => {
try {
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: {
SDEPARTMENT: storedArgs.sCustomerDept || storedArgs.sDepartment,
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}" separator="true"/>
<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="ShowHaulerAnl" caption="Гаражка" panelName="HaulerAnl"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowEqsRepairAnlATC" caption="Аналитика по ремонтам АТС" panelName="RepairAnlATC"/>
<MenuItem parent="{BA073333-DFBC-4BA3-8EA7-172F3F6B4FEE}" name="ShowEqsHaulerAnl" caption="Гаражка" panelName="HaulerAnl"/>
</App>
<App name="MechanicalRecords">
<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}" name="ShowClntTaskBoard" caption="Доски задач" panelName="ClntTaskBoard"/>
</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>
<Panels urlBase="Modules/P8-Panels/#/">
<Panel

View File

@ -80,7 +80,11 @@ const Filter = ({ filter, onFilterOpen }) => {
{filter.dDateBegin ? <FilterItem caption={"Дата с"} value={formatDateRF(filter.dDateBegin)} onClick={handleClick} /> : null}
{filter.dDateEnd ? <FilterItem caption={"Дата по"} value={formatDateRF(filter.dDateEnd)} onClick={handleClick} /> : null}
{filter.sCustomerDept ? (
<FilterItem caption={"Транспортный участок"} value={filter.sCustomerDept} onClick={handleClick} />
<FilterItem
caption={"Транспортный участок"}
value={`${filter.sCustomerDeptName} (${filter.sCustomerDept})`}
onClick={handleClick}
/>
) : null}
{filter.sWorkType ? <FilterItem caption={"Типовая работа"} value={filter.sWorkType} 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 PropTypes from "prop-types"; //Контроль свойств компонента
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"; //Вспомогательные функции
//---------
@ -50,15 +50,20 @@ const FilterDialog = ({ initial, isFiltersInit, onCancel, onOk }) => {
//Вспомогательные функции открытия раздела
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 = () =>
handleInsDepartmentOpen({
sCode: filter.sCustomerDept,
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 = () => {
setFilter({ dDateBegin: "", dDateEnd: "", sCustomerDept: "", sWorkType: "", sWorkKind: "" });
setFilter({ dDateBegin: "", dDateEnd: "", sCustomerDept: "", sCustomerDeptName: "", sWorkType: "", sWorkKind: "" });
};
//При закрытии диалога без изменения фильтра
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 (

View File

@ -9,6 +9,7 @@
import { useContext, useCallback } from "react"; //Классы React
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 { pOnlineShowDictionary } = useContext(ApplicationСtx);
const { pOnlineShowDictionary, pOnlineShowUnit } = useContext(ApplicationСtx);
//Отображение раздела "Штатные подразделения"
const handleInsDepartmentOpen = useCallback(
@ -64,15 +65,21 @@ const useDictionary = () => {
//Отображение раздела "Ремонтные ведомости"
const handleEquipRepairSheetsOpen = useCallback(
async prms => {
pOnlineShowDictionary({
// pOnlineShowDictionary({
// unitCode: "EquipRepairSheets",
// inputParameters: [{ name: "in_RN", value: prms.nRn }],
// callBack: res => {
// res.success ? prms.callBack(res) : null;
// }
// });
pOnlineShowUnit({
unitCode: "EquipRepairSheets",
inputParameters: [{ name: "in_RN", value: prms.nRn }],
callBack: res => {
res.success ? prms.callBack(res) : null;
}
modal: false
});
},
[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: "",
dDateEnd: "",
sCustomerDept: "",
sCustomerDeptName: "",
sWorkType: "",
sWorkKind: ""
});