ЦИТК-957, ЦИТК-953, ЦИТК-939 - Исправление панели "Производственная программа"

Reviewed-on: #34
This commit is contained in:
Mim 2025-06-17 13:09:30 +03:00
commit c6688bd451
3 changed files with 191 additions and 137 deletions

View File

@ -48,7 +48,8 @@ const useCostRouteLists = (task, taskType) => {
NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1
},
attributeValueProcessor: (name, val) => (["DEXEC_DATE", "DREL_DATE"].includes(name) ? formatDateRF(val) : val),
attributeValueProcessor: (name, val) =>
["DEXEC_DATE", "DREL_DATE"].includes(name) ? formatDateRF(val) : ["SDOCPREF", "SDOCNUMB"].includes(name) ? undefined : val,
respArg: "COUT"
});
setCostRouteLists(pv => ({

View File

@ -84,7 +84,26 @@ const STYLES = {
TASK_DIALOG_ACTION_CONTAINER: { border: 1, borderColor: "text.primary", borderRadius: "5px", width: "100%" },
FILTERS: { display: "table", float: "right" },
FILTERS_DATE: { display: "table-cell", verticalAlign: "middle" },
FILTERS_LEVEL: { display: "table-cell", verticalAlign: "middle", paddingLeft: "15px" }
FILTERS_LEVEL: { display: "table-cell", verticalAlign: "middle", paddingLeft: "15px" },
FILTERS_LEVEL_CAPTION: { display: "flex", alignItems: "center" },
FILTERS_LEVEL_LIMIT_ICON: { padding: "0px 8px", color: "#9f9c9c" },
FILTERS_LIMIT_SELECT: nOutOfLimit => {
return nOutOfLimit === 1
? {
".MuiOutlinedInput-notchedOutline": {
borderColor: "#e9863c"
},
"&:hover .MuiOutlinedInput-notchedOutline": {
borderColor: "#e9863c",
borderWidth: "0.15rem"
},
"&.Mui-focused .MuiOutlinedInput-notchedOutline": {
borderColor: "#e9863c",
borderWidth: "0.15rem"
}
}
: {};
}
};
//------------------------------------
@ -236,6 +255,7 @@ const MechRecCostProdPlans = () => {
selectedPlanCtlg: null,
selectedPlanCtlgMaxLevel: null,
selectedPlanCtlgLevel: null,
selectedPlanCtlgOutOfLimit: 0,
selectedPlanCtlgSort: null,
selectedPlanCtlgMenuItems: null,
gantt: {},
@ -258,6 +278,9 @@ const MechRecCostProdPlans = () => {
//Подключение к контексту навигации
const { getNavigationSearch } = useContext(NavigationCtx);
//Подключение к контексту сообщений
const { showMsgInfo } = useContext(MessagingСtx);
//Инициализация каталогов планов
const initPlanCtlgs = useCallback(async () => {
if (!state.init) {
@ -280,6 +303,7 @@ const MechRecCostProdPlans = () => {
selectedPlanCtlgSpecsLoaded: false,
selectedPlanCtlgMaxLevel: null,
selectedPlanCtlgLevel: null,
selectedPlanCtlgOutOfLimit: 0,
selectedPlanCtlgSort: null,
selectedPlanCtlgMenuItems: null,
gantt: {},
@ -297,6 +321,7 @@ const MechRecCostProdPlans = () => {
selectedPlanCtlg: null,
selectedPlanCtlgMaxLevel: null,
selectedPlanCtlgLevel: null,
selectedPlanCtlgOutOfLimit: 0,
selectedPlanCtlgSort: null,
selectedPlanCtlgMenuItems: null,
gantt: {},
@ -317,6 +342,7 @@ const MechRecCostProdPlans = () => {
...pv,
selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,
selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,
selectedPlanCtlgOutOfLimit: data.NOUT_OF_LIMIT,
selectedPlanCtlgSort: sort,
selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems
? state.selectedPlanCtlgMenuItems
@ -370,6 +396,17 @@ const MechRecCostProdPlans = () => {
setState(pv => ({ ...pv, selectedTaskDetail: taskRn, selectedTaskDetailType: taskType }));
};
//При открытии окна информации об ограничении уровня
const handleLevelLimitInfoOpen = () => {
//Отображаем информацию
showMsgInfo(
`Размер производственной программы превышает предельно допустимый для одновременного отображения в виде диаграммы Ганта.
Доступные для просмотра уровни вложенности ограничены.
Вы можете просматривать производственную программу частями, используя действие "Открытие панели Производственная программа" в спецификации "Выпуск"
раздела "Планы и отчеты производства изделий".`
);
};
//Генерация содержимого
return (
<Box>
@ -434,8 +471,16 @@ const MechRecCostProdPlans = () => {
</Select>
</Box>
<Box sx={STYLES.FILTERS_LEVEL}>
<Box sx={STYLES.FILTERS_LEVEL_CAPTION}>
<InputLabel id="select-label-level">До уровня</InputLabel>
{state.selectedPlanCtlgOutOfLimit === 1 ? (
<IconButton sx={STYLES.FILTERS_LEVEL_LIMIT_ICON} onClick={handleLevelLimitInfoOpen}>
<Icon>info</Icon>
</IconButton>
) : null}
</Box>
<Select
sx={STYLES.FILTERS_LIMIT_SELECT(state.selectedPlanCtlgOutOfLimit)}
labelId="select-label-level"
id="select-level"
value={state.selectedPlanCtlgLevel}

View File

@ -85,7 +85,8 @@ create or replace package PKG_P8PANELS_MECHREC as
NLEVEL in number := null, -- Уровень отбора
SSORT_FIELD in varchar2 := 'DREP_DATE_TO', -- Поле сортировки
COUT out clob, -- Список задач
NMAX_LEVEL out number -- Максимальный уровень иерархии
NMAX_LEVEL out number, -- Максимальный уровень иерархии
NOUT_OF_LIMIT out number -- Признак превышения лимита (0 - нет, 1 - да)
);
/* Инициализация каталогов раздела "Планы и отчеты производства изделий" для панели "Производственная программа" */
@ -1403,11 +1404,6 @@ create or replace package body PKG_P8PANELS_MECHREC as
NSTORAGE_IN := null;
NNOMENCLATURE := null;
end;
/* Если номенклатура не указана */
if ((NNOMENCLATURE is null) or ((NSTORAGE is null) and (NSTORAGE_IN is null))) then
/* Не идем дальше */
return;
end if;
/* Инициализируем даты */
DDATE := TRUNC(sysdate);
/* Читем сортировки */
@ -1455,6 +1451,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => true,
BORDER => true);
/* Если номенклатура или хранилища указаны */
if ((NNOMENCLATURE is not null) or ((NSTORAGE is not null) and (NSTORAGE_IN is not null))) then
/* Обходим данные */
begin
/* Добавляем подсказку совместимости */
@ -1574,6 +1572,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
raise;
end;
end if;
/* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end GOODSPARTIES_DG_GET;
@ -2264,7 +2263,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
NLEVEL in number := null, -- Уровень отбора
SSORT_FIELD in varchar2 := 'DREP_DATE_TO', -- Поле сортировки
COUT out clob, -- Список задач
NMAX_LEVEL out number -- Максимальный уровень иерархии
NMAX_LEVEL out number, -- Максимальный уровень иерархии
NOUT_OF_LIMIT out number -- Признак превышения лимита (0 - нет, 1 - да)
)
is
/* Переменные */
@ -2305,15 +2305,20 @@ create or replace package body PKG_P8PANELS_MECHREC as
end MAKE_INFO;
/* Считывание максимального уровня иерархии плана по каталогу */
function PRODPLAN_MAX_LEVEL_GET
procedure PRODPLAN_MAX_LEVEL_GET
(
NCRN in number, -- Рег. номер каталога планов
NFCPRODPLANSP in number -- Рег. номер позиции спецификации
) return number -- Максимальный уровень иерархии
NFCPRODPLANSP in number, -- Рег. номер позиции спецификации
NMAX_LEVEL out number, -- Максимальный уровень иерархии
NOUT_OF_LIMIT out number -- Признак превышения лимита (0 - нет, 1 - да)
)
is
NRESULT PKG_STD.TNUMBER := 1; -- Максимальный уровень иерархии
NTOTAL PKG_STD.TNUMBER := 0; -- Сумма документов по проверяемому уровню
begin
/* Обнуляем признак привышения лимита */
NOUT_OF_LIMIT := 0;
/* Инициализируем максимальный уровень иерархии */
NMAX_LEVEL := 1;
/* Цикл по уровням каталога планов */
for REC in (select level,
count(TMP.RN) COUNT_DOCS
@ -2358,14 +2363,14 @@ create or replace package body PKG_P8PANELS_MECHREC as
NTOTAL := NTOTAL + REC.COUNT_DOCS;
/* Если сумма документов по текущему уровню превышает максимальное количество задач */
if (NTOTAL >= NMAX_TASKS) then
/* Устанавливаем признак превышения лимита */
NOUT_OF_LIMIT := 1;
/* Выходим из цикла */
exit;
end if;
/* Указываем текущий уровень */
NRESULT := REC.LEVEL;
NMAX_LEVEL := REC.LEVEL;
end loop;
/* Возвращаем результат */
return NRESULT;
end PRODPLAN_MAX_LEVEL_GET;
/* Определение дат спецификации плана */
@ -2745,7 +2750,10 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Инициализируем описания цветов */
TASK_COLORS_INIT(RG => RG);
/* Определяем максимальный уровень иерархии */
NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN, NFCPRODPLANSP => NFCPRODPLANSP);
PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN,
NFCPRODPLANSP => NFCPRODPLANSP,
NMAX_LEVEL => NMAX_LEVEL,
NOUT_OF_LIMIT => NOUT_OF_LIMIT);
/* Определяем уровень фильтра */
NLEVEL_FILTER := COALESCE(NLEVEL, NMAX_LEVEL);
/* Обходим данные */