P8-Panels/db/PKG_P8PANELS_MECHREC.pck

427 lines
25 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

create or replace package PKG_P8PANELS_MECHREC as
/* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
procedure FCPRODPLANSP_GET
(
NFCPRODPLAN in number, -- Рег. номер родителя
NLEVEL in number := null, -- Уровень отбора
COUT out clob, -- Список проектов
NMAX_LEVEL out number -- Максимальный уровень иерархии
);
/* Инициализация планов и отчетов производства изделий */
procedure PRODPLAN_INIT
(
COUT out clob -- Список планов и отчетов производства изделий
);
end PKG_P8PANELS_MECHREC;
/
create or replace package body PKG_P8PANELS_MECHREC as
/* Константы - цвета отображения */
SBG_COLOR_RED constant PKG_STD.TSTRING := 'red'; -- Цвет заливки красный (Дефицит запуска != 0)
SBG_COLOR_YELLOW constant PKG_STD.TSTRING := '#e0db44'; -- Цвет заливки желтый (Дефицит» запуска = 0 и Выпуск факт = 0)
SBG_COLOR_GREEN constant PKG_STD.TSTRING := 'lightgreen'; -- Цвет заливки зеленый (Дефицит выпуска = 0)
SBG_COLOR_BLACK constant PKG_STD.TSTRING := 'black'; -- Цвет заливки черный (Нет дат и связей)
STEXT_COLOR_ORANGE constant PKG_STD.TSTRING := '#FF8C00'; -- Цвет текста для черной заливки (оранжевый)
/* Константы - параметры отборов планов */
NFCPRODPLAN_CATEGORY constant PKG_STD.TNUMBER := 1; -- Категория планов "Производственная программа"
NFCPRODPLAN_STATUS constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден"
SFCPRODPLAN_TYPE constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния)
/* Константы - дополнительные атрибуты */
STASK_ATTR_DEFRESLIZ constant PKG_STD.TSTRING := 'defresliz'; -- Дефицит запуска
STASK_ATTR_REL_FACT constant PKG_STD.TSTRING := 'rel_fact'; -- Выпуск факт
STASK_ATTR_DEFSTART constant PKG_STD.TSTRING := 'defstart'; -- Дефицит выпуска
STASK_ATTR_LEVEL constant PKG_STD.TSTRING := 'level'; -- Уровень
/* Формирование характеристик спецификации в Ганте */
procedure MAKE_GANT_ITEM
(
NDEFRESLIZ in number, -- Дефицит запуска
NREL_FACT in number, -- Выпуск факт
NDEFSTART in number, -- Дефицит выпуска
STASK_BG_COLOR out varchar2, -- Цвет заливки спецификации
STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет заливки прогресса спецификации
NTASK_PROGRESS out number -- Прогресс спецификации
)
is
begin
/* Если дефицит запуска <> 0 */
if (NDEFRESLIZ <> 0) then
/* Полностью красный */
STASK_BG_COLOR := SBG_COLOR_RED;
STASK_BG_PROGRESS_COLOR := null;
NTASK_PROGRESS := null;
else
/* Если дефицит выпуска = 0 */
if (NDEFSTART = 0) then
/* Полностью зеленый */
STASK_BG_COLOR := SBG_COLOR_GREEN;
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;
NTASK_PROGRESS := 50;
end if;
end if;
end if;
end MAKE_GANT_ITEM;
/* Считывание заголовка документа */
function TITLE_GET
(
NRN in number -- Рег. номер плана и отчета производства изделий
) return varchar2 -- Заголовок для отображения
is
SRESULT PKG_STD.TSTRING; -- Заголовок для отображения
SDOC_INFO PKG_STD.TSTRING; -- Информация о документе
SJURPERSONS_CODE PKG_STD.TSTRING; -- Мнемокод принадлежности
SINS_DEPARTMENT_CODE PKG_STD.TSTRING; -- Мнемокод подразделения
begin
/* Считываем информацию из плана */
begin
select D.DOCCODE || ', ' || trim(T.PREFIX) || '/' || trim(T.NUMB) || ', от ' || TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') DOC_INFO,
J.CODE,
SD.CODE
into SDOC_INFO,
SJURPERSONS_CODE,
SINS_DEPARTMENT_CODE
from FCPRODPLAN T,
DOCTYPES D,
JURPERSONS J,
INS_DEPARTMENT SD
where T.RN = NRN
and D.RN = T.DOCTYPE
and J.RN = T.JUR_PERS
and SD.RN = T.SUBDIV;
exception
when others then
return 'Нет информации.';
end;
/* Формируем заголовок */
SRESULT := 'План и отчет производства изделия "' || SDOC_INFO || '", принадлежность "' || SJURPERSONS_CODE ||
'", подразделение "' || SINS_DEPARTMENT_CODE || '"';
/* Возвращаем результат */
return SRESULT;
end TITLE_GET;
/* Считывание максимального уровня иерархии плана */
function PRODPLAN_MAX_LEVEL_GET
(
NPRODPLAN in number -- Рег. номер плана
) return number -- Максимальный уровень иерархии
is
NRESULT PKG_STD.TNUMBER; -- Максимальный уровень иерархии
begin
/* Считываем максимальный уровень */
begin
select max(level)
into NRESULT
from (select T.RN,
T.UP_LEVEL
from FCPRODPLANSP T
where T.PRN = NPRODPLAN) 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, -- Цвет элемента (черный, если даты не заданы и нет связи, иначе null)
STASK_TEXT_COLOR out varchar2, -- Цвет текста элемента (хаки, если даты не заданы и нет связи, иначе null)
NTASK_PROGRESS out number -- Прогресс элемента (проинициализирует null, если даты не заданы и нет связи)
)
is
begin
/* Проициниализируем цвет и прогресс */
STASK_BG_COLOR := null;
NTASK_PROGRESS := null;
STASK_TEXT_COLOR := 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;
end FCPRODPLANSP_DATES_GET;
/* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
procedure FCPRODPLANSP_GET
(
NFCPRODPLAN in number, -- Рег. номер родителя
NLEVEL in number := null, -- Уровень отбора
COUT out clob, -- Список проектов
NMAX_LEVEL out number -- Максимальный уровень иерархии
)
is
/* Переменные */
RG PKG_P8PANELS_VISUAL.TGANTT; -- Описание диаграммы Ганта
RGT PKG_P8PANELS_VISUAL.TGANTT_TASK; -- Описание задачи для диаграммы
BREAD_ONLY_DATES boolean := false; -- Флаг доступности дат проекта только для чтения
STASK_BG_COLOR PKG_STD.TSTRING; -- Цвет заливки задачи
STASK_TEXT_COLOR PKG_STD.TSTRING; -- Цвет текста задачи
STASK_BG_PROGRESS_COLOR PKG_STD.TSTRING; -- Цвет заливки прогресса задачи
NTASK_PROGRESS PKG_STD.TNUMBER; -- Прогресс выполнения задачи
DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации
DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации
begin
/* Инициализируем диаграмму Ганта */
RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => TITLE_GET(NRN => NFCPRODPLAN),
NZOOM => PKG_P8PANELS_VISUAL.NGANTT_ZOOM_DAY,
BREAD_ONLY_DATES => BREAD_ONLY_DATES,
BREAD_ONLY_PROGRESS => true);
/* Добавим динамические атрибуты к спецификациям */
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
SNAME => STASK_ATTR_DEFRESLIZ,
SCAPTION => 'Дефицит запуска');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
SNAME => STASK_ATTR_REL_FACT,
SCAPTION => 'Выпуск факт');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
SNAME => STASK_ATTR_DEFSTART,
SCAPTION => 'Дефицит выпуска');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_LEVEL, SCAPTION => 'Уровень');
/* Добавим описание цветов */
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,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит выпуска» = 0.');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_GREEN,
SBG_PROGRESS_COLOR => SBG_COLOR_YELLOW,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» != 0. ');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_BLACK,
STEXT_COLOR => STEXT_COLOR_ORANGE,
SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
/* Определяем максимальный уровень иерархии */
NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NPRODPLAN => NFCPRODPLAN);
/* Цикл по спецификации плана с учетом иерархии */
for REC in (select TMP.*,
level
from (select T.RN,
T.REP_DATE,
T.REP_DATE_TO,
T.INCL_DATE,
T.ROUTE,
D.NOMEN_NAME,
(T.QUANT_REST - T.START_FACT) DEFRESLIZ,
T.REL_FACT,
(T.MAIN_QUANT - T.REL_FACT) DEFSTART,
(select 1
from DUAL
where exists
(select null
from DOCLINKS L
where L.IN_DOCUMENT = T.RN
and L.IN_UNITCODE = 'CostProductPlansSpecs'
and (L.OUT_UNITCODE = 'CostRouteLists' or L.OUT_UNITCODE = 'IncomFromDeps')
and ROWNUM = 1)) HAVE_LINK,
T.UP_LEVEL
from FCPRODPLANSP T,
FCMATRESOURCE FM,
DICNOMNS D
where T.PRN = NFCPRODPLAN
and ((T.REP_DATE is not null) or (T.REP_DATE_TO is not null) or (T.INCL_DATE is not null))
and FM.RN = T.MATRES
and D.RN = FM.NOMENCLATURE) TMP
where ((NLEVEL is null) or ((NLEVEL is not null) and (level <= NLEVEL)))
connect by prior TMP.RN = TMP.UP_LEVEL
start with TMP.UP_LEVEL is null)
loop
/* Инициализируем даты и цвет (если необходимо) */
FCPRODPLANSP_DATES_GET(DREP_DATE => REC.REP_DATE,
DREP_DATE_TO => REC.REP_DATE_TO,
DINCL_DATE => REC.INCL_DATE,
NHAVE_LINK => COALESCE(REC.HAVE_LINK, 0),
DDATE_FROM => DDATE_FROM,
DDATE_TO => DDATE_TO,
STASK_BG_COLOR => STASK_BG_COLOR,
STASK_TEXT_COLOR => STASK_TEXT_COLOR,
NTASK_PROGRESS => NTASK_PROGRESS);
/* Если цвет изначально не указан и требуется анализирование */
if (STASK_BG_COLOR is null) then
/* Формирование характеристик элемента ганта */
MAKE_GANT_ITEM(NDEFRESLIZ => REC.DEFRESLIZ,
NREL_FACT => REC.REL_FACT,
NDEFSTART => REC.DEFSTART,
STASK_BG_COLOR => STASK_BG_COLOR,
STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
NTASK_PROGRESS => NTASK_PROGRESS);
end if;
/* Сформируем основную спецификацию */
RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => REC.RN,
SNUMB => COALESCE(REC.ROUTE, 'Отсутствует'),
SCAPTION => REC.NOMEN_NAME,
SNAME => REC.NOMEN_NAME,
DSTART => DDATE_FROM,
DEND => DDATE_TO,
NPROGRESS => NTASK_PROGRESS,
SBG_COLOR => STASK_BG_COLOR,
STEXT_COLOR => STASK_TEXT_COLOR,
SBG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
BREAD_ONLY => true,
BREAD_ONLY_DATES => true,
BREAD_ONLY_PROGRESS => true);
/* Добавим доп. атрибуты */
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
SNAME => STASK_ATTR_DEFRESLIZ,
SVALUE => TO_CHAR(REC.DEFRESLIZ),
BCLEAR => true);
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
SNAME => STASK_ATTR_REL_FACT,
SVALUE => TO_CHAR(REC.REL_FACT));
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
SNAME => STASK_ATTR_DEFSTART,
SVALUE => TO_CHAR(REC.DEFSTART));
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
SNAME => STASK_ATTR_LEVEL,
SVALUE => REC.LEVEL);
/* Собираем зависимости */
for LINK in (select T.RN
from FCPRODPLANSP T
where T.PRN = NFCPRODPLAN
and T.UP_LEVEL = REC.RN
and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= REC.LEVEL + 1))))
loop
/* Добавляем зависимости */
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN);
end loop;
/* Добавляем основную спецификацию в диаграмму */
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT);
end loop;
/* Формируем список */
COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG);
end FCPRODPLANSP_GET;
/* Инициализация планов и отчетов производства изделий */
procedure PRODPLAN_INIT
(
COUT out clob -- Список планов и отчетов производства изделий
)
is
begin
/* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */
PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
/* Цикл по планам и отчетам производства изделий */
for REC in (select T.RN NRN,
D.DOCCODE || ', ' || trim(T.PREFIX) || '/' || trim(T.NUMB) || ', ' ||
TO_CHAR(T.DOCDATE, 'dd.mm.yyyy') SDOC_INFO
from FCPRODPLAN T,
DOCTYPES D,
FINSTATE FS
where T.CATEGORY = NFCPRODPLAN_CATEGORY
and T.STATUS = NFCPRODPLAN_STATUS
and D.RN = T.DOCTYPE
and FS.RN = T.TYPE
and FS.CODE = SFCPRODPLAN_TYPE
and exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */
null
from USERPRIV UP
where UP.CATALOG = T.CRN
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_CATALOG_AUTHID) */
null
from USERPRIV UP
where UP.CATALOG = T.CRN
and UP.AUTHID = UTILIZER)
and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
null
from USERPRIV UP
where UP.JUR_PERS = T.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 = T.JUR_PERS
and UP.UNITCODE = 'CostProductPlans'
and UP.AUTHID = UTILIZER)
order by T.DOCDATE desc)
loop
/* Открываем план */
PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLANS');
/* Описываем план */
PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => REC.SDOC_INFO);
/* Закрываем план */
PKG_XFAST.UP();
end loop;
/* Закрываем корень */
PKG_XFAST.UP();
/* Сериализуем */
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
exception
when others then
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end PRODPLAN_INIT;
end PKG_P8PANELS_MECHREC;
/