ЦИТК-835, ЦИТК-842 - Производственная программа - рефакторинг, ограничение уровней отображения программы

This commit is contained in:
Mikhail Chechnev 2024-05-08 09:55:24 +03:00 committed by GitHub
commit 852a083a3b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -79,6 +79,23 @@ create or replace package body PKG_P8PANELS_MECHREC as
NFCPRODPLAN_CATEGORY constant PKG_STD.TNUMBER := 1; -- Категория планов "Производственная программа" NFCPRODPLAN_CATEGORY constant PKG_STD.TNUMBER := 1; -- Категория планов "Производственная программа"
NFCPRODPLAN_STATUS constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден" NFCPRODPLAN_STATUS constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден"
SFCPRODPLAN_TYPE constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния) SFCPRODPLAN_TYPE constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния)
NMAX_TASKS constant PKG_STD.TNUMBER := 10000; -- Максимальное количество отображаемых задач
/* Константы - классы задач плана ("Производственная программа") */
NCLASS_WO_DEFICIT constant PKG_STD.TNUMBER := 0; -- Без дефицита выпуска
NCLASS_PART_DEFICIT constant PKG_STD.TNUMBER := 1; -- С частичным дефицитом выпуска
NCLASS_FULL_DEFICIT constant PKG_STD.TNUMBER := 2; -- С полным дефицитом выпуска
NCLASS_WITH_DEFICIT constant PKG_STD.TNUMBER := 3; -- С дефицитом запуска или датой меньше текущей
NCLASS_FUTURE_DATE constant PKG_STD.TNUMBER := 4; -- Дата анализа еще не наступила
NCLASS_WO_LINKS constant PKG_STD.TNUMBER := 5; -- Задача без связи
/* Константы - типы задач плана, содержание детализации ("Производственная программа") */
NTASK_TYPE_RL_WITH_GP constant PKG_STD.TNUMBER := 0; -- Маршрутные листы с развертыванием товарных запасов
NTASK_TYPE_RL_WITH_DL constant PKG_STD.TNUMBER := 1; -- Маршрутные листы с развертыванием комплектаций
NTASK_TYPE_INC_DEPS constant PKG_STD.TNUMBER := 2; -- Приход из подразделений
NTASK_TYPE_INC_DEPS_RL constant PKG_STD.TNUMBER := 3; -- Приход из подразделений и маршрутные листы
NTASK_TYPE_RL constant PKG_STD.TNUMBER := 4; -- Маршрутные листы
NTASK_TYPE_EMPTY constant PKG_STD.TNUMBER := null; -- Нет детализации
/* Константы - дополнительные атрибуты */ /* Константы - дополнительные атрибуты */
STASK_ATTR_START_FACT constant PKG_STD.TSTRING := 'start_fact'; -- Запущено STASK_ATTR_START_FACT constant PKG_STD.TSTRING := 'start_fact'; -- Запущено
@ -88,7 +105,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
STASK_ATTR_DL constant PKG_STD.TSTRING := 'detail_list'; -- Связанные документы STASK_ATTR_DL constant PKG_STD.TSTRING := 'detail_list'; -- Связанные документы
STASK_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Тип (0 - Деталь, 1 - Изделие/сборочная единица) STASK_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Тип (0 - Деталь, 1 - Изделие/сборочная единица)
STASK_ATTR_MEAS constant PKG_STD.TSTRING := 'meas'; -- Единица измнения STASK_ATTR_MEAS constant PKG_STD.TSTRING := 'meas'; -- Единица измнения
/* Инциализация списка маршрутных листов (с иерархией) */ /* Инциализация списка маршрутных листов (с иерархией) */
procedure UTL_FCROUTLST_IDENT_INIT procedure UTL_FCROUTLST_IDENT_INIT
( (
@ -141,7 +158,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PUT_FCROUTLST(NIDENT => NIDENT, NFCROUTLST => RLST.RN); PUT_FCROUTLST(NIDENT => NIDENT, NFCROUTLST => RLST.RN);
end loop; end loop;
end UTL_FCROUTLST_IDENT_INIT; end UTL_FCROUTLST_IDENT_INIT;
/* Проверка наличия связанных маршрутных листов */ /* Проверка наличия связанных маршрутных листов */
function LINK_FCROUTLST_CHECK function LINK_FCROUTLST_CHECK
( (
@ -174,7 +191,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Возвращаем результат */ /* Возвращаем результат */
return NRESULT; return NRESULT;
end LINK_FCROUTLST_CHECK; end LINK_FCROUTLST_CHECK;
/* Проверка наличия связанных приходов из подразделений */ /* Проверка наличия связанных приходов из подразделений */
function LINK_INCOMEFROMDEPS_CHECK function LINK_INCOMEFROMDEPS_CHECK
( (
@ -228,7 +245,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT); P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
raise; raise;
end LINK_INCOMEFROMDEPS_CHECK; end LINK_INCOMEFROMDEPS_CHECK;
/* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */ /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
procedure INCOMEFROMDEPS_DG_GET procedure INCOMEFROMDEPS_DG_GET
( (
@ -272,7 +289,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => true); BVISIBLE => true);
/* Если тип = 3, то необходимо включать состояние */ /* Если тип = 3, то необходимо включать состояние */
if (NTYPE = 3) then if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SDOC_STATE', SNAME => 'SDOC_STATE',
SCAPTION => 'Состояние', SCAPTION => 'Состояние',
@ -403,7 +420,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NPOSITION => 2); NPOSITION => 2);
/* Если тип = 3, то необходимо включать состояние */ /* Если тип = 3, то необходимо включать состояние */
if (NTYPE = 3) then if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SDOC_STATE', SNAME => 'SDOC_STATE',
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
@ -444,7 +461,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT); P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
raise; raise;
end INCOMEFROMDEPS_DG_GET; end INCOMEFROMDEPS_DG_GET;
/* Получение таблицы строк комплектации на основании маршрутного листа */ /* Получение таблицы строк комплектации на основании маршрутного листа */
procedure FCDELIVERYLISTSP_DG_GET procedure FCDELIVERYLISTSP_DG_GET
( (
@ -632,7 +649,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */ /* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end FCDELIVERYLISTSP_DG_GET; end FCDELIVERYLISTSP_DG_GET;
/* Получение таблицы товарных запасов на основании маршрутного листа */ /* Получение таблицы товарных запасов на основании маршрутного листа */
procedure GOODSPARTIES_DG_GET procedure GOODSPARTIES_DG_GET
( (
@ -840,7 +857,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */ /* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end GOODSPARTIES_DG_GET; end GOODSPARTIES_DG_GET;
/* Получение таблицы маршрутных листов, связанных со спецификацией плана (по детали) */ /* Получение таблицы маршрутных листов, связанных со спецификацией плана (по детали) */
procedure FCROUTLST_DG_BY_DTL procedure FCROUTLST_DG_BY_DTL
( (
@ -1038,7 +1055,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */ /* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end FCROUTLST_DG_BY_DTL; end FCROUTLST_DG_BY_DTL;
/* Получение таблицы маршрутных листов, связанных со спецификацией плана (по изделию) */ /* Получение таблицы маршрутных листов, связанных со спецификацией плана (по изделию) */
procedure FCROUTLST_DG_BY_PRDCT procedure FCROUTLST_DG_BY_PRDCT
( (
@ -1223,7 +1240,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */ /* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end FCROUTLST_DG_BY_PRDCT; end FCROUTLST_DG_BY_PRDCT;
/* Получение таблицы маршрутных листов, связанных со спецификацией плана (для приходов) */ /* Получение таблицы маршрутных листов, связанных со спецификацией плана (для приходов) */
procedure FCROUTLST_DG_BY_DEPS procedure FCROUTLST_DG_BY_DEPS
( (
@ -1329,7 +1346,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.DREL_DATE,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.DREL_DATE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NREL_QUANT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NREL_QUANT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT_FACT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT_FACT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then P.NLABOUR_FACT / P.NT_SHT_PLAN * 100 else 0 end NPROCENT'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * 100, 3) else 0 end NPROCENT');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCPREF SDOCPREF,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCPREF SDOCPREF,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCNUMB SDOCNUMB,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCNUMB SDOCNUMB,');
@ -1361,7 +1378,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
@ -1373,7 +1390,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists')); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
@ -1449,12 +1466,12 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Сериализуем описание */ /* Сериализуем описание */
COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
end FCROUTLST_DG_BY_DEPS; end FCROUTLST_DG_BY_DEPS;
/* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */ /* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
procedure FCROUTLST_DG_GET procedure FCROUTLST_DG_GET
( (
NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
NTYPE in number, -- Тип спецификации плана (0 - Деталь, 1 - Изделие/сборочная единица, 3/4 - ПиП) NTYPE in number, -- Тип спецификации плана (см. константы NTASK_TYPE_*)
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number, -- Количество записей на странице (0 - все) NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
CORDERS in clob, -- Сортировки CORDERS in clob, -- Сортировки
@ -1466,7 +1483,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Выбираем сборку таблицы, исходя из типа спецификации плана */ /* Выбираем сборку таблицы, исходя из типа спецификации плана */
case case
/* Деталь */ /* Деталь */
when (NTYPE = 0) then when (NTYPE = NTASK_TYPE_RL_WITH_GP) then
/* Получаем таблицу по детали */ /* Получаем таблицу по детали */
FCROUTLST_DG_BY_DTL(NFCPRODPLANSP => NFCPRODPLANSP, FCROUTLST_DG_BY_DTL(NFCPRODPLANSP => NFCPRODPLANSP,
NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_NUMBER => NPAGE_NUMBER,
@ -1475,7 +1492,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
NINCLUDE_DEF => NINCLUDE_DEF, NINCLUDE_DEF => NINCLUDE_DEF,
COUT => COUT); COUT => COUT);
/* Изделие/сборочная единица */ /* Изделие/сборочная единица */
when (NTYPE = 1) then when (NTYPE = NTASK_TYPE_RL_WITH_DL) then
/* Получаем таблицу по изделию */ /* Получаем таблицу по изделию */
FCROUTLST_DG_BY_PRDCT(NFCPRODPLANSP => NFCPRODPLANSP, FCROUTLST_DG_BY_PRDCT(NFCPRODPLANSP => NFCPRODPLANSP,
NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_NUMBER => NPAGE_NUMBER,
@ -1484,7 +1501,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
NINCLUDE_DEF => NINCLUDE_DEF, NINCLUDE_DEF => NINCLUDE_DEF,
COUT => COUT); COUT => COUT);
/* Для приходов из подразделений */ /* Для приходов из подразделений */
when ((NTYPE = 3) or (NTYPE = 4)) then when ((NTYPE = NTASK_TYPE_INC_DEPS_RL) or (NTYPE = NTASK_TYPE_RL)) then
/* Получаем таблицу по приходу */ /* Получаем таблицу по приходу */
FCROUTLST_DG_BY_DEPS(NFCPRODPLANSP => NFCPRODPLANSP, FCROUTLST_DG_BY_DEPS(NFCPRODPLANSP => NFCPRODPLANSP,
NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_NUMBER => NPAGE_NUMBER,
@ -1497,174 +1514,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
'Не определен тип получения таблицы маршрутных листов.'); 'Не определен тип получения таблицы маршрутных листов.');
end case; end case;
end FCROUTLST_DG_GET; end FCROUTLST_DG_GET;
/* Формирование характеристик спецификации в Ганте */
procedure MAKE_GANT_ITEM
(
NDEFRESLIZ in number, -- Дефицит запуска
NREL_FACT in number, -- Выпуск факт
NDEFSTART in number, -- Дефицит выпуска
NMAIN_QUANT in number, -- Выпуск
STASK_BG_COLOR out varchar2, -- Цвет заливки спецификации
STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет заливки прогресса спецификации
STASK_TEXT_COLOR in out varchar2, -- Цвет текста
NTASK_PROGRESS out number -- Прогресс спецификации
)
is
begin
/* Если дефицит запуска <> 0 */
if (NDEFRESLIZ <> 0) then
/* Если дефицит выпуска = 0 */
if (NDEFSTART = 0) then
/* Полностью зеленый */
STASK_BG_COLOR := SBG_COLOR_GREEN;
STASK_TEXT_COLOR := STEXT_COLOR_GREY;
STASK_BG_PROGRESS_COLOR := null;
NTASK_PROGRESS := null;
else
/* Полностью красный */
STASK_BG_COLOR := SBG_COLOR_RED;
STASK_BG_PROGRESS_COLOR := null;
NTASK_PROGRESS := null;
end if;
else
/* Если дефицит выпуска = 0 */
if (NDEFSTART = 0) then
/* Полностью зеленый */
STASK_BG_COLOR := SBG_COLOR_GREEN;
STASK_TEXT_COLOR := STEXT_COLOR_GREY;
STASK_BG_PROGRESS_COLOR := null;
NTASK_PROGRESS := null;
else
/* Если дефицит запуска = 0 и выпуск факт = 0 */
if ((NDEFRESLIZ = 0) and (NREL_FACT = 0)) then
/* Полностью жёлтый */
STASK_BG_COLOR := SBG_COLOR_YELLOW;
STASK_BG_PROGRESS_COLOR := null;
NTASK_PROGRESS := null;
end if;
/* Если дефицит запуска = 0 и выпуск факт <> 0 */
if ((NDEFRESLIZ = 0) and (NREL_FACT <> 0)) then
/* Частично зелёный, прогресс жёлтый */
STASK_BG_COLOR := SBG_COLOR_GREEN;
STASK_BG_PROGRESS_COLOR := SBG_COLOR_YELLOW;
STASK_TEXT_COLOR := STEXT_COLOR_GREY;
NTASK_PROGRESS := ROUND(NREL_FACT / NMAIN_QUANT * 100);
end if;
end if;
end if;
end MAKE_GANT_ITEM;
/* Считывание максимального уровня иерархии плана по каталогу */
function PRODPLAN_MAX_LEVEL_GET
(
NCRN in number -- Рег. номер каталога планов
) return number -- Максимальный уровень иерархии
is
NRESULT PKG_STD.TNUMBER; -- Максимальный уровень иерархии
begin
/* Считываем максимальный уровень */
begin
select max(level)
into NRESULT
from (select T.RN,
T.UP_LEVEL
from FCPRODPLAN P,
FCPRODPLANSP T,
FINSTATE FS
where P.CRN = NCRN
and P.CATEGORY = NFCPRODPLAN_CATEGORY
and P.STATUS = NFCPRODPLAN_STATUS
and FS.RN = P.TYPE
and FS.CODE = SFCPRODPLAN_TYPE
and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
null
from USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'CostProductPlans'
and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */
UR.ROLEID
from USERROLES UR
where UR.AUTHID = UTILIZER())
union all
select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */
null
from USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'CostProductPlans'
and UP.AUTHID = UTILIZER())
and T.PRN = P.RN
and T.MAIN_QUANT > 0) TMP
connect by prior TMP.RN = TMP.UP_LEVEL
start with TMP.UP_LEVEL is null;
exception
when others then
NRESULT := null;
end;
/* Возвращаем результат */
return NRESULT;
end PRODPLAN_MAX_LEVEL_GET;
/* Определение дат спецификации плана */
procedure FCPRODPLANSP_DATES_GET
(
DREP_DATE in date, -- Дата запуска спецификации
DREP_DATE_TO in date, -- Дата выпуска спецификации
DINCL_DATE in date, -- Дата включения в план спецификации
NHAVE_LINK in number := 0, -- Наличие связей с "Маршрутный лист" или "Приход из подразделения"
DDATE_FROM out date, -- Итоговая дата запуска спецификации
DDATE_TO out date, -- Итоговая дата выпуска спецификации
STASK_BG_COLOR out varchar2, -- Цвет элемента
STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет прогресса элемента
STASK_TEXT_COLOR out varchar2, -- Цвет текста элемента
NTASK_PROGRESS out number -- Прогресс элемента
)
is
begin
/* Проициниализируем цвет и прогресс */
STASK_BG_COLOR := null;
STASK_TEXT_COLOR := null;
STASK_BG_PROGRESS_COLOR := null;
NTASK_PROGRESS := null;
/* Если даты запуска и выпуска пусты */
if ((DREP_DATE is null) and (DREP_DATE_TO is null)) then
/* Указываем дату включения в план */
DDATE_FROM := DINCL_DATE;
DDATE_TO := DINCL_DATE;
else
/* Указываем даты исходя из дат запуска/выпуска */
DDATE_FROM := COALESCE(DREP_DATE, DREP_DATE_TO);
DDATE_TO := COALESCE(DREP_DATE_TO, DREP_DATE);
end if;
/* Если одна из дат не указана */
if ((DREP_DATE is null) or (DREP_DATE_TO is null)) then
/* Если спецификация также не имеет связей */
if (NHAVE_LINK = 0) then
/* Закрашиваем в черный */
STASK_BG_COLOR := SBG_COLOR_BLACK;
STASK_TEXT_COLOR := STEXT_COLOR_ORANGE;
NTASK_PROGRESS := null;
end if;
end if;
/* Если нет связанных документов */
if (NHAVE_LINK = 0) then
/* Если дата запуска меньше текущей даты */
if (DREP_DATE <= sysdate) then
/* Закрашиваем в красный */
STASK_BG_COLOR := SBG_COLOR_RED;
STASK_TEXT_COLOR := null;
NTASK_PROGRESS := null;
end if;
/* Если дата больше текущей даты */
if (DREP_DATE > sysdate) then
/* Закрашиваем в серый */
STASK_BG_COLOR := SBG_COLOR_GREY;
STASK_TEXT_COLOR := null;
NTASK_PROGRESS := null;
end if;
end if;
end FCPRODPLANSP_DATES_GET;
/* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */ /* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
procedure FCPRODPLANSP_GET procedure FCPRODPLANSP_GET
( (
@ -1686,10 +1536,12 @@ create or replace package body PKG_P8PANELS_MECHREC as
DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации
DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации
STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте
NTYPE PKG_STD.TNUMBER; -- Тип задачи (0/1 - для "Дата выпуска", 2/3/4 - для "Дата выпуска") NTYPE PKG_STD.TNUMBER; -- Тип задачи (см. константы NTASK_TYPE_*)
SDETAIL_LIST PKG_STD.TSTRING; -- Ссылки на детализацию SDETAIL_LIST PKG_STD.TSTRING; -- Ссылки на детализацию
SPLAN_TITLE PKG_STD.TSTRING; -- Заголовок плана SPLAN_TITLE PKG_STD.TSTRING; -- Заголовок плана
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
NTASK_CLASS PKG_STD.TNUMBER; -- Класс задачи (см. константы NCLASS_*)
NLEVEL_FILTER PKG_STD.TNUMBER; -- Уровень для фильтра
/* Объединение значений в строковое представление */ /* Объединение значений в строковое представление */
function MAKE_INFO function MAKE_INFO
@ -1710,10 +1562,92 @@ create or replace package body PKG_P8PANELS_MECHREC as
return SRESULT; return SRESULT;
end MAKE_INFO; end MAKE_INFO;
/* Считывание максимального уровня иерархии плана по каталогу */
function PRODPLAN_MAX_LEVEL_GET
(
NCRN in number -- Рег. номер каталога планов
) return number -- Максимальный уровень иерархии
is
NRESULT PKG_STD.TNUMBER := 1; -- Максимальный уровень иерархии
NTOTAL PKG_STD.TNUMBER := 0; -- Сумма документов по проверяемому уровню
begin
/* Цикл по уровням каталога планов */
for REC in (select level,
count(TMP.RN) COUNT_DOCS
from (select T.RN,
T.UP_LEVEL
from FCPRODPLAN P,
FCPRODPLANSP T,
FINSTATE FS
where P.CRN = NCRN
and P.CATEGORY = NFCPRODPLAN_CATEGORY
and P.STATUS = NFCPRODPLAN_STATUS
and FS.RN = P.TYPE
and FS.CODE = SFCPRODPLAN_TYPE
and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
null
from USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'CostProductPlans'
and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */
UR.ROLEID
from USERROLES UR
where UR.AUTHID = UTILIZER())
union all
select /*+ INDEX(UP I_USERPRIV_JUR_PERS_AUTHID) */
null
from USERPRIV UP
where UP.JUR_PERS = P.JUR_PERS
and UP.UNITCODE = 'CostProductPlans'
and UP.AUTHID = UTILIZER())
and T.PRN = P.RN
and T.MAIN_QUANT > 0) TMP
connect by prior TMP.RN = TMP.UP_LEVEL
start with TMP.UP_LEVEL is null
group by level
order by level)
loop
/* Получаем количество задач с учетом текущего уровня */
NTOTAL := NTOTAL + REC.COUNT_DOCS;
/* Если сумма документов по текущему уровню превышает максимальное количество задач */
if (NTOTAL >= NMAX_TASKS) then
/* Выходим из цикла */
exit;
end if;
/* Указываем текущий уровень */
NRESULT := REC.LEVEL;
end loop;
/* Возвращаем результат */
return NRESULT;
end PRODPLAN_MAX_LEVEL_GET;
/* Определение дат спецификации плана */
procedure FCPRODPLANSP_DATES_GET
(
DREP_DATE in date, -- Дата запуска спецификации
DREP_DATE_TO in date, -- Дата выпуска спецификации
DINCL_DATE in date, -- Дата включения в план спецификации
DDATE_FROM out date, -- Итоговая дата запуска спецификации
DDATE_TO out date -- Итоговая дата выпуска спецификации
)
is
begin
/* Если даты запуска и выпуска пусты */
if ((DREP_DATE is null) and (DREP_DATE_TO is null)) then
/* Указываем дату включения в план */
DDATE_FROM := DINCL_DATE;
DDATE_TO := DINCL_DATE;
else
/* Указываем даты исходя из дат запуска/выпуска */
DDATE_FROM := COALESCE(DREP_DATE, DREP_DATE_TO);
DDATE_TO := COALESCE(DREP_DATE_TO, DREP_DATE);
end if;
end FCPRODPLANSP_DATES_GET;
/* Инициализация динамических атрибутов */ /* Инициализация динамических атрибутов */
procedure TASK_ATTRS_INIT procedure TASK_ATTRS_INIT
( (
RG in out PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта RG in out nocopy PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта
) )
is is
begin begin
@ -1739,41 +1673,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
SCAPTION => 'Единица измерения'); SCAPTION => 'Единица измерения');
end TASK_ATTRS_INIT; end TASK_ATTRS_INIT;
/* Инициализация цветов */
procedure TASK_COLORS_INIT
(
RG in out PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта
)
is
begin
/* Добавим описание цветов */
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_RED,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» != 0 или ' ||
'не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» меньше текущей.');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_YELLOW,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» = 0.');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_GREEN,
STEXT_COLOR => STEXT_COLOR_GREY,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_GREEN,
SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW,
STEXT_COLOR => STEXT_COLOR_GREY,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. ');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_BLACK,
STEXT_COLOR => STEXT_COLOR_ORANGE,
SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_GREY,
SDESC => 'Для спецификаций планов и отчетов производства изделий не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» больше текущей.');
end TASK_COLORS_INIT;
/* Заполнение значений динамических атрибутов */ /* Заполнение значений динамических атрибутов */
procedure FILL_TASK_ATTRS procedure TASK_ATTRS_FILL
( (
RG in PKG_P8PANELS_VISUAL.TGANTT, -- Описание диаграммы Ганта RG in PKG_P8PANELS_VISUAL.TGANTT, -- Описание диаграммы Ганта
RGT in out nocopy PKG_P8PANELS_VISUAL.TGANTT_TASK, -- Описание задачи для диаграммы RGT in out nocopy PKG_P8PANELS_VISUAL.TGANTT_TASK, -- Описание задачи для диаграммы
@ -1781,7 +1682,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
NMAIN_QUANT in number, -- Выпуск NMAIN_QUANT in number, -- Выпуск
NREL_FACT in number, -- Выпуск факт NREL_FACT in number, -- Выпуск факт
DREP_DATE_TO in date, -- Дата выпуска DREP_DATE_TO in date, -- Дата выпуска
NTYPE in number, -- Тип (0 - Деталь, 1 - Изделие/сборочная единица) NTYPE in number, -- Тип (см. константы NTASK_TYPE_*)
SDETAIL_LIST in varchar2, -- Ссылки на детализацию SDETAIL_LIST in varchar2, -- Ссылки на детализацию
SMEAS in varchar2 -- Единица измерения SMEAS in varchar2 -- Единица измерения
) )
@ -1817,8 +1718,103 @@ create or replace package body PKG_P8PANELS_MECHREC as
RTASK => RGT, RTASK => RGT,
SNAME => STASK_ATTR_MEAS, SNAME => STASK_ATTR_MEAS,
SVALUE => SMEAS); SVALUE => SMEAS);
end FILL_TASK_ATTRS; end TASK_ATTRS_FILL;
/* Инициализация цветов */
procedure TASK_COLORS_INIT
(
RG in out nocopy PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта
)
is
begin
/* Добавим описание цветов */
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_RED,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» != 0 или ' ||
'не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» меньше текущей.');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_YELLOW,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» = 0.');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_GREEN,
STEXT_COLOR => STEXT_COLOR_GREY,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_GREEN,
SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW,
STEXT_COLOR => STEXT_COLOR_GREY,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. ');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_BLACK,
STEXT_COLOR => STEXT_COLOR_ORANGE,
SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_GREY,
SDESC => 'Для спецификаций планов и отчетов производства изделий не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» больше текущей.');
end TASK_COLORS_INIT;
/* Опеределение класса задачи */
function GET_TASK_CLASS
(
NDEFRESLIZ in number, -- Дефицит запуска
NREL_FACT in number, -- Выпуск факт
NDEFSTART in number, -- Дефицит выпуска
DREP_DATE in date, -- Дата запуска спецификации
DREP_DATE_TO in date, -- Дата выпуска спецификации
NHAVE_LINK in number := 0 -- Наличие связей с "Маршрутный лист" или "Приход из подразделения"
) return number -- Класс задачи
is
NTASK_CLASS PKG_STD.TNUMBER; -- Класс задачи (см. константы NCLASS*)
begin
/* Если одна из дат не указана */
if ((DREP_DATE is null) or (DREP_DATE_TO is null)) then
/* Если спецификация также не имеет связей */
if (NHAVE_LINK = 0) then
NTASK_CLASS := NCLASS_WO_LINKS;
end if;
else
/* Если нет связанных документов */
if (NHAVE_LINK = 0) then
/* Если дата запуска меньше текущей даты */
if (DREP_DATE <= sysdate) then
NTASK_CLASS := NCLASS_WITH_DEFICIT;
end if;
/* Если дата больше текущей даты */
if (DREP_DATE > sysdate) then
NTASK_CLASS := NCLASS_FUTURE_DATE;
end if;
end if;
end if;
/* Если класс не определен */
if (NTASK_CLASS is null) then
/* Если дефицит запуска <> 0 */
if (NDEFRESLIZ <> 0) then
/* Если дефицит выпуска = 0 */
if (NDEFSTART = 0) then
NTASK_CLASS := NCLASS_WO_DEFICIT;
else
NTASK_CLASS := NCLASS_WITH_DEFICIT;
end if;
else
/* Если дефицит выпуска = 0 */
if (NDEFSTART = 0) then
NTASK_CLASS := NCLASS_WO_DEFICIT;
else
/* Если дефицит запуска = 0 и выпуск факт = 0 */
if ((NDEFRESLIZ = 0) and (NREL_FACT = 0)) then
NTASK_CLASS := NCLASS_FULL_DEFICIT;
end if;
/* Если дефицит запуска = 0 и выпуск факт <> 0 */
if ((NDEFRESLIZ = 0) and (NREL_FACT <> 0)) then
NTASK_CLASS := NCLASS_PART_DEFICIT;
end if;
end if;
end if;
end if;
/* Возвращаем результат */
return NTASK_CLASS;
end GET_TASK_CLASS;
/* Получение типа задачи */ /* Получение типа задачи */
procedure GET_TASK_TYPE procedure GET_TASK_TYPE
( (
@ -1826,29 +1822,19 @@ create or replace package body PKG_P8PANELS_MECHREC as
SSORT_FIELD in varchar2, -- Тип сортировки SSORT_FIELD in varchar2, -- Тип сортировки
NFCPRODPLAN in number, -- Рег. номер плана NFCPRODPLAN in number, -- Рег. номер плана
NFCPRODPLANSP in number, -- Рег. номер спецификации плана NFCPRODPLANSP in number, -- Рег. номер спецификации плана
STASK_BG_COLOR in varchar2, -- Цвет заливки задачи NTASK_CLASS in number, -- Класс задачи (см. константы NCLASS_*)
STASK_BG_PROGRESS_COLOR in varchar2, -- Цвет заливки прогресса NTYPE out number, -- Тип задачи (см. константы NTASK_TYPE_*)
NTYPE out number, -- Тип задачи (0/1 - для "Дата выпуска", 2/3/4 - для "Дата выпуска")
SDETAIL_LIST out varchar2 -- Ссылки на детализацию SDETAIL_LIST out varchar2 -- Ссылки на детализацию
) )
is is
begin begin
/*
Описание типов:
0 - Маршрутные листы с развертыванием товарных запасов
1 - Маршрутные листы с развертыванием комплектаций
2 - Приход из подразделений
3 - Приход из подразделений и маршрутные листы
4 - Маршрутные листы
null - Нет детализации
*/
/* Исходим сортировка по "Дата запуска" */ /* Исходим сортировка по "Дата запуска" */
if (SSORT_FIELD = 'DREP_DATE') then if (SSORT_FIELD = 'DREP_DATE') then
/* Если цвет - красный */ /* Если класс "С дефицитом запуска или датой меньше текущей" */
if (STASK_BG_COLOR = SBG_COLOR_RED) then if (NTASK_CLASS = NCLASS_WITH_DEFICIT) then
/* Проверяем деталь или изделие */ /* Проверяем деталь или изделие */
begin begin
select 1 select NTASK_TYPE_RL_WITH_DL
into NTYPE into NTYPE
from DUAL from DUAL
where exists (select null where exists (select null
@ -1857,72 +1843,119 @@ create or replace package body PKG_P8PANELS_MECHREC as
and SP.UP_LEVEL = NFCPRODPLANSP); and SP.UP_LEVEL = NFCPRODPLANSP);
exception exception
when others then when others then
NTYPE := 0; NTYPE := NTASK_TYPE_RL_WITH_GP;
end; end;
/* Проверяем наличие связей с маршрутными листами */ /* Проверяем наличие связей с маршрутными листами */
if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 0) = 0) then if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 0) = 0) then
/* Указываем, что маршрутных листов нет */ /* Указываем, что маршрутных листов нет */
SDETAIL_LIST := 'Нет маршрутных листов'; SDETAIL_LIST := 'Нет маршрутных листов';
NTYPE := null; NTYPE := NTASK_TYPE_EMPTY;
else else
/* Указываем, что маршрутные листы есть */ /* Указываем, что маршрутные листы есть */
SDETAIL_LIST := 'Маршрутные листы'; SDETAIL_LIST := 'Маршрутные листы';
end if; end if;
else else
/* Не отображаем информацию о маршрутных листах */ /* Не отображаем информацию о маршрутных листах */
NTYPE := null; NTYPE := NTASK_TYPE_EMPTY;
SDETAIL_LIST := null; SDETAIL_LIST := null;
end if; end if;
else else
/* Если цвет зеленый */ /* Исходим от класса */
if (STASK_BG_COLOR = SBG_COLOR_GREEN) then case
/* Если полностью зеленый */ /* Если класс "Без дефицита выпуска" */
if (STASK_BG_PROGRESS_COLOR is null) then when (NTASK_CLASS = NCLASS_WO_DEFICIT) then
/* Проверяем наличией связей с приходов из подразделений */ /* Проверяем наличией связей с приходов из подразделений */
if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 2) = 0) then if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 2) = 0) then
/* Указываем, что приходов из подразделений нет */ /* Указываем, что приходов из подразделений нет */
SDETAIL_LIST := 'Нет приходов из подразделений'; SDETAIL_LIST := 'Нет приходов из подразделений';
NTYPE := null; NTYPE := NTASK_TYPE_EMPTY;
else else
/* Указываем, что приходы из подразделений есть */ /* Указываем, что приходы из подразделений есть */
SDETAIL_LIST := 'Приход из подразделений'; SDETAIL_LIST := 'Приход из подразделений';
NTYPE := 2; NTYPE := NTASK_TYPE_INC_DEPS;
end if; end if;
end if; /* Если класс "С частичным дефицитом выпуска" */
/* Если желтно-зеленый */ when (NTASK_CLASS = NCLASS_PART_DEFICIT) then
if (STASK_BG_PROGRESS_COLOR = SBG_COLOR_YELLOW) then
/* Проверяем наличией связей с приходов из подразделений */ /* Проверяем наличией связей с приходов из подразделений */
if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP) = 0) then if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP) = 0) then
/* Указываем, что приходов из подразделений нет */ /* Указываем, что приходов из подразделений нет */
SDETAIL_LIST := 'Нет приходов из подразделений'; SDETAIL_LIST := 'Нет приходов из подразделений';
NTYPE := null; NTYPE := NTASK_TYPE_EMPTY;
else else
/* Указываем, что приходы из подразделений есть */ /* Указываем, что приходы из подразделений есть */
SDETAIL_LIST := 'Приход из подразделений'; SDETAIL_LIST := 'Приход из подразделений';
NTYPE := 3; NTYPE := NTASK_TYPE_INC_DEPS_RL;
end if; end if;
end if; /* Если класс "С дефицитом запуска или датой меньше текущей" или "С полным дефицитом выпуска" */
else when ((NTASK_CLASS = NCLASS_FULL_DEFICIT) or (NTASK_CLASS = NCLASS_WITH_DEFICIT)) then
/* Если цвет полностью желтый или красный */
if ((STASK_BG_COLOR = SBG_COLOR_YELLOW) or (STASK_BG_COLOR = SBG_COLOR_RED)) then
/* Проверяем наличие связей с маршрутными листами */ /* Проверяем наличие связей с маршрутными листами */
if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 1) = 0) then if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 1) = 0) then
/* Указываем, что маршрутных листов нет */ /* Указываем, что маршрутных листов нет */
SDETAIL_LIST := 'Нет маршрутных листов'; SDETAIL_LIST := 'Нет маршрутных листов';
NTYPE := null; NTYPE := NTASK_TYPE_EMPTY;
else else
/* Указываем, что маршрутные листы есть */ /* Указываем, что маршрутные листы есть */
SDETAIL_LIST := 'Маршрутные листы'; SDETAIL_LIST := 'Маршрутные листы';
NTYPE := 4; NTYPE := NTASK_TYPE_RL;
end if; end if;
/* Класс не поддерживается */
else else
/* Для данных критериев ничего не выводится */ /* Для данных классов ничего не выводится */
NTYPE := null; NTYPE := NTASK_TYPE_EMPTY;
SDETAIL_LIST := null; SDETAIL_LIST := null;
end if; end case;
end if;
end if; end if;
end GET_TASK_TYPE; end GET_TASK_TYPE;
/* Формирование цветовых характеристик для задачи */
procedure GET_TASK_COLORS
(
NTASK_CLASS in number, -- Класс задачи (см. константы NCLASS_*)
STASK_BG_COLOR out varchar2, -- Цвет заливки спецификации
STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет заливки прогресса спецификации
STASK_TEXT_COLOR in out varchar2 -- Цвет текста
)
is
begin
/* Исходим от класса задачи */
case NTASK_CLASS
/* Без дефицита выпуска */
when NCLASS_WO_DEFICIT then
STASK_BG_COLOR := SBG_COLOR_GREEN;
STASK_TEXT_COLOR := STEXT_COLOR_GREY;
STASK_BG_PROGRESS_COLOR := null;
/* С частичным дефицитом выпуска */
when NCLASS_PART_DEFICIT then
STASK_BG_COLOR := SBG_COLOR_GREEN;
STASK_BG_PROGRESS_COLOR := SBG_COLOR_YELLOW;
STASK_TEXT_COLOR := STEXT_COLOR_GREY;
/* С полным дефицитом выпуска */
when NCLASS_FULL_DEFICIT then
STASK_BG_COLOR := SBG_COLOR_YELLOW;
STASK_TEXT_COLOR := null;
STASK_BG_PROGRESS_COLOR := null;
/* С дефицитом запуска или датой меньше текущей */
when NCLASS_WITH_DEFICIT then
STASK_BG_COLOR := SBG_COLOR_RED;
STASK_TEXT_COLOR := null;
STASK_BG_PROGRESS_COLOR := null;
/* Дата анализа еще не наступила */
when NCLASS_FUTURE_DATE then
STASK_BG_COLOR := SBG_COLOR_GREY;
STASK_TEXT_COLOR := null;
STASK_BG_PROGRESS_COLOR := null;
/* Задача без связи */
when NCLASS_WO_LINKS then
STASK_BG_COLOR := SBG_COLOR_BLACK;
STASK_TEXT_COLOR := STEXT_COLOR_ORANGE;
STASK_BG_PROGRESS_COLOR := null;
else
/* Не определено */
STASK_BG_COLOR := null;
STASK_TEXT_COLOR := null;
STASK_BG_PROGRESS_COLOR := null;
end case;
end GET_TASK_COLORS;
begin begin
/* Определяем заголовок плана */ /* Определяем заголовок плана */
FIND_ACATALOG_RN(NFLAG_SMART => 0, FIND_ACATALOG_RN(NFLAG_SMART => 0,
@ -1942,6 +1975,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
TASK_COLORS_INIT(RG => RG); TASK_COLORS_INIT(RG => RG);
/* Определяем максимальный уровень иерархии */ /* Определяем максимальный уровень иерархии */
NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN); NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN);
/* Определяем уровень фильтра */
NLEVEL_FILTER := COALESCE(NLEVEL, NMAX_LEVEL);
/* Обходим данные */ /* Обходим данные */
for C in (select TMP.*, for C in (select TMP.*,
level NTASK_LEVEL level NTASK_LEVEL
@ -2010,7 +2045,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
and FM.RN = T.MATRES and FM.RN = T.MATRES
and D.RN = FM.NOMENCLATURE and D.RN = FM.NOMENCLATURE
and D.UMEAS_MAIN = DM.RN) TMP and D.UMEAS_MAIN = DM.RN) TMP
where ((NLEVEL is null) or ((NLEVEL is not null) and (level <= NLEVEL))) where level <= NLEVEL_FILTER
connect by prior TMP.NRN = TMP.NUP_LEVEL connect by prior TMP.NRN = TMP.NUP_LEVEL
start with TMP.NUP_LEVEL is null start with TMP.NUP_LEVEL is null
order siblings by TMP.DORDER_DATE asc) order siblings by TMP.DORDER_DATE asc)
@ -2020,28 +2055,31 @@ create or replace package body PKG_P8PANELS_MECHREC as
SNOMEN_NAME => C.SNOMEN_NAME, SNOMEN_NAME => C.SNOMEN_NAME,
SSUBDIV_DLVR => C.SSUBDIV_DLVR, SSUBDIV_DLVR => C.SSUBDIV_DLVR,
NMAIN_QUANT => C.NMAIN_QUANT); NMAIN_QUANT => C.NMAIN_QUANT);
/* Определяем класс задачи */
NTASK_CLASS := GET_TASK_CLASS(NDEFRESLIZ => C.NDEFRESLIZ,
NREL_FACT => C.NREL_FACT,
NDEFSTART => C.NDEFSTART,
DREP_DATE => C.DREP_DATE,
DREP_DATE_TO => C.DREP_DATE_TO,
NHAVE_LINK => COALESCE(C.NHAVE_LINK, 0));
/* Инициализируем даты и цвет (если необходимо) */ /* Инициализируем даты и цвет (если необходимо) */
FCPRODPLANSP_DATES_GET(DREP_DATE => C.DREP_DATE, FCPRODPLANSP_DATES_GET(DREP_DATE => C.DREP_DATE,
DREP_DATE_TO => C.DREP_DATE_TO, DREP_DATE_TO => C.DREP_DATE_TO,
DINCL_DATE => C.DINCL_DATE, DINCL_DATE => C.DINCL_DATE,
NHAVE_LINK => COALESCE(C.NHAVE_LINK, 0), DDATE_FROM => DDATE_FROM,
DDATE_FROM => DDATE_FROM, DDATE_TO => DDATE_TO);
DDATE_TO => DDATE_TO, /* Формирование характеристик элемента ганта */
STASK_BG_COLOR => STASK_BG_COLOR, GET_TASK_COLORS(NTASK_CLASS => NTASK_CLASS,
STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, STASK_BG_COLOR => STASK_BG_COLOR,
STASK_TEXT_COLOR => STASK_TEXT_COLOR, STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
NTASK_PROGRESS => NTASK_PROGRESS); STASK_TEXT_COLOR => STASK_TEXT_COLOR);
/* Если цвет изначально не указан и требуется анализирование */ /* Если класс задачи "С частичным дефицитом выпуска" */
if (STASK_BG_COLOR is null) then if (NTASK_CLASS = NCLASS_PART_DEFICIT) then
/* Формирование характеристик элемента ганта */ /* Определяем пропорции прогресса */
MAKE_GANT_ITEM(NDEFRESLIZ => C.NDEFRESLIZ, NTASK_PROGRESS := ROUND(C.NREL_FACT / C.NMAIN_QUANT * 100);
NREL_FACT => C.NREL_FACT, else
NDEFSTART => C.NDEFSTART, /* Не требуется */
NMAIN_QUANT => C.NMAIN_QUANT, NTASK_PROGRESS := null;
STASK_BG_COLOR => STASK_BG_COLOR,
STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
STASK_TEXT_COLOR => STASK_TEXT_COLOR,
NTASK_PROGRESS => NTASK_PROGRESS);
end if; end if;
/* Сформируем основную спецификацию */ /* Сформируем основную спецификацию */
RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => C.NRN, RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => C.NRN,
@ -2058,16 +2096,15 @@ create or replace package body PKG_P8PANELS_MECHREC as
BREAD_ONLY_DATES => true, BREAD_ONLY_DATES => true,
BREAD_ONLY_PROGRESS => true); BREAD_ONLY_PROGRESS => true);
/* Определяем тип и ссылки на детализацию */ /* Определяем тип и ссылки на детализацию */
GET_TASK_TYPE(NCOMPANY => NCOMPANY, GET_TASK_TYPE(NCOMPANY => NCOMPANY,
SSORT_FIELD => SSORT_FIELD, SSORT_FIELD => SSORT_FIELD,
NFCPRODPLAN => C.NPRN, NFCPRODPLAN => C.NPRN,
NFCPRODPLANSP => C.NRN, NFCPRODPLANSP => C.NRN,
STASK_BG_COLOR => STASK_BG_COLOR, NTASK_CLASS => NTASK_CLASS,
STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR, NTYPE => NTYPE,
NTYPE => NTYPE, SDETAIL_LIST => SDETAIL_LIST);
SDETAIL_LIST => SDETAIL_LIST);
/* Заполним значение динамических атрибутов */ /* Заполним значение динамических атрибутов */
FILL_TASK_ATTRS(RG => RG, TASK_ATTRS_FILL(RG => RG,
RGT => RGT, RGT => RGT,
NSTART_FACT => C.NSTART_FACT, NSTART_FACT => C.NSTART_FACT,
NMAIN_QUANT => C.NMAIN_QUANT, NMAIN_QUANT => C.NMAIN_QUANT,
@ -2082,7 +2119,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
where T.PRN = C.NPRN where T.PRN = C.NPRN
and T.UP_LEVEL = C.NRN and T.UP_LEVEL = C.NRN
and T.MAIN_QUANT > 0 and T.MAIN_QUANT > 0
and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= C.NTASK_LEVEL + 1)))) and NLEVEL_FILTER >= C.NTASK_LEVEL + 1)
loop loop
/* Добавляем зависимости */ /* Добавляем зависимости */
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN); PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN);