БД: панель "Работы проектов" - доработан алгоритм переноса изменений буфера балансировки в проект, доработан алгоритм исправления сроков связанных работ
This commit is contained in:
parent
68f73a28f1
commit
d8ee37ee93
@ -17,10 +17,12 @@ create table P8PNL_JB_JOBS
|
|||||||
EXECUTOR varchar2(2000) default null, -- Исполнитель
|
EXECUTOR varchar2(2000) default null, -- Исполнитель
|
||||||
STAGE number(1) default 0 not null, -- Признак этапа (0 - нет, 1 - да)
|
STAGE number(1) default 0 not null, -- Признак этапа (0 - нет, 1 - да)
|
||||||
EDITABLE number(1) default 0 not null, -- Признак возможности редактирования (0 - нет, 1 - да)
|
EDITABLE number(1) default 0 not null, -- Признак возможности редактирования (0 - нет, 1 - да)
|
||||||
|
CHANGED number(1) default 0 not null, -- Признак наличия изменений, требующих сохранения (0 - нет, 1 - да)
|
||||||
constraint C_P8PNL_JB_JOBS_RN_PK primary key (RN),
|
constraint C_P8PNL_JB_JOBS_RN_PK primary key (RN),
|
||||||
constraint C_P8PNL_JB_JOBS_PRN_FK foreign key (PRN) references P8PNL_JB_PRJCTS (RN),
|
constraint C_P8PNL_JB_JOBS_PRN_FK foreign key (PRN) references P8PNL_JB_PRJCTS (RN),
|
||||||
constraint C_P8PNL_JB_JOBS_HRN_FK foreign key (HRN) references P8PNL_JB_JOBS (RN),
|
constraint C_P8PNL_JB_JOBS_HRN_FK foreign key (HRN) references P8PNL_JB_JOBS (RN),
|
||||||
constraint C_P8PNL_JB_JOBS_STAGE_VAL check (STAGE in (0, 1)),
|
constraint C_P8PNL_JB_JOBS_STAGE_VAL check (STAGE in (0, 1)),
|
||||||
constraint C_P8PNL_JB_JOBS_EDTBL_VAL check (EDITABLE in (0, 1)),
|
constraint C_P8PNL_JB_JOBS_EDTBL_VAL check (EDITABLE in (0, 1)),
|
||||||
|
constraint C_P8PNL_JB_JOBS_CHNGD_VAL check (CHANGED in (0, 1)),
|
||||||
constraint C_P8PNL_JB_JOBS_UN unique (IDENT, PRN, SOURCE)
|
constraint C_P8PNL_JB_JOBS_UN unique (IDENT, PRN, SOURCE)
|
||||||
);
|
);
|
||||||
|
@ -360,7 +360,9 @@ create or replace package PKG_P8PANELS_PROJECTS as
|
|||||||
DDATE_FROM in date, -- Новая дата начала
|
DDATE_FROM in date, -- Новая дата начала
|
||||||
DDATE_TO in date, -- Новая дата окончания
|
DDATE_TO in date, -- Новая дата окончания
|
||||||
DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов
|
DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов
|
||||||
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
|
DFACT in date, -- Факт по состоянию на
|
||||||
|
NDURATION_MEAS in number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
|
||||||
|
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения, -1 - ничего не изменяли)
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Получение списка работ проектов для диаграммы Ганта */
|
/* Получение списка работ проектов для диаграммы Ганта */
|
||||||
@ -417,7 +419,14 @@ create or replace package PKG_P8PANELS_PROJECTS as
|
|||||||
/* Очистка данных балансировки */
|
/* Очистка данных балансировки */
|
||||||
procedure JB_CLEAN
|
procedure JB_CLEAN
|
||||||
(
|
(
|
||||||
NIDENT in number -- Идентификатор буфера сформированных данных
|
NIDENT in number -- Идентификатор процесса
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Перенос данных буфера балансировки в проекты */
|
||||||
|
procedure JB_SAVE
|
||||||
|
(
|
||||||
|
NIDENT in number, -- Идентификатор процесса
|
||||||
|
COUT out clob -- Список проектов
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Формирование исходных данных для балансировки планов-графиков работ */
|
/* Формирование исходных данных для балансировки планов-графиков работ */
|
||||||
@ -427,7 +436,7 @@ create or replace package PKG_P8PANELS_PROJECTS as
|
|||||||
DFACT in out date, -- Факт по состоянию на
|
DFACT in out date, -- Факт по состоянию на
|
||||||
NDURATION_MEAS in out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
|
NDURATION_MEAS in out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
|
||||||
SLAB_MEAS in out varchar2, -- Единица измерения трудоёмкости
|
SLAB_MEAS in out varchar2, -- Единица измерения трудоёмкости
|
||||||
NIDENT in out number, -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
|
NIDENT in out number, -- Идентификатор процесса (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
|
||||||
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
|
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -450,11 +459,6 @@ TODO: owner="root" created="25.10.2023"
|
|||||||
text="Права доступа в мониторе ресурвов при балансировке планов-графиков"
|
text="Права доступа в мониторе ресурвов при балансировке планов-графиков"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
TODO: owner="root" created="25.10.2023"
|
|
||||||
text="Признак измененности на работах, чтобы удобнее было переносить в проект"
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO: owner="root" created="25.10.2023"
|
TODO: owner="root" created="25.10.2023"
|
||||||
text="Вынести расчте плановой трудоёмкости по графику (и всех её причендалов) в отдельную функцию (и), чтобы можно было включить её в динамический запрос и вернуть сортировку по полям трудоёмкости в JB_PERIODS_LIST_PLAN_JOBS"
|
text="Вынести расчте плановой трудоёмкости по графику (и всех её причендалов) в отдельную функцию (и), чтобы можно было включить её в динамический запрос и вернуть сортировку по полям трудоёмкости в JB_PERIODS_LIST_PLAN_JOBS"
|
||||||
@ -511,6 +515,32 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NRN, SUNIT_TABLE => 'PROJECT');
|
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NRN, SUNIT_TABLE => 'PROJECT');
|
||||||
end GET;
|
end GET;
|
||||||
|
|
||||||
|
/* Проверка пользователя на ответственность за проект */
|
||||||
|
function CHECK_RESPONSIBLE
|
||||||
|
(
|
||||||
|
NRN in number, -- Рег. номер проекта
|
||||||
|
SAUTHID in varchar2 -- Имя пользователя
|
||||||
|
) return number -- Признак ответственности за проект (0 - не ответственный, 1 - ответственный)
|
||||||
|
is
|
||||||
|
RP PROJECT%rowtype; -- Запись проекта
|
||||||
|
NRES PKG_STD.TNUMBER := 0; -- Буфер для результата
|
||||||
|
NAUTHID_AGENT PKG_STD.TREF; -- Рег. номер контрагента пользователя
|
||||||
|
begin
|
||||||
|
/* Считаем проект */
|
||||||
|
RP := GET(NRN => NRN);
|
||||||
|
/* Найдем контрагента, соответствующего текущему пользователю */
|
||||||
|
FIND_AGNLIST_AUTHID(NFLAG_OPTION => 1, NCOMPANY => RP.COMPANY, SPERS_AUTHID => SAUTHID, NAGENT => NAUTHID_AGENT);
|
||||||
|
/* Проверим ответственность */
|
||||||
|
if (RP.RESPONSIBLE = NAUTHID_AGENT) then
|
||||||
|
NRES := 1;
|
||||||
|
end if;
|
||||||
|
/* Вернём результат */
|
||||||
|
return NRES;
|
||||||
|
exception
|
||||||
|
when others then
|
||||||
|
return NRES;
|
||||||
|
end CHECK_RESPONSIBLE;
|
||||||
|
|
||||||
/* Отбор проектов */
|
/* Отбор проектов */
|
||||||
procedure COND
|
procedure COND
|
||||||
as
|
as
|
||||||
@ -4152,6 +4182,18 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NJB_PRJCTS, SUNIT_TABLE => 'P8PNL_JB_PRJCTS');
|
PKG_MSG.RECORD_NOT_FOUND(NFLAG_SMART => 0, NDOCUMENT => NJB_PRJCTS, SUNIT_TABLE => 'P8PNL_JB_PRJCTS');
|
||||||
end JB_PRJCTS_GET;
|
end JB_PRJCTS_GET;
|
||||||
|
|
||||||
|
/* Установка признака наличия изменений проекта, требующих сохранения */
|
||||||
|
procedure JB_PRJCTS_SET_CHANGED
|
||||||
|
(
|
||||||
|
NJB_PRJCTS in number, -- Рег. номер записи списка балансируемых проектов
|
||||||
|
NCHANGED in number -- Признак наличия изменений, требующих сохранения (0 - нет, 1 - да)
|
||||||
|
)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
/* Установим признак */
|
||||||
|
update P8PNL_JB_PRJCTS T set T.CHANGED = NCHANGED where T.RN = NJB_PRJCTS;
|
||||||
|
end JB_PRJCTS_SET_CHANGED;
|
||||||
|
|
||||||
/* Базовое добавление проекта для балансировки работ */
|
/* Базовое добавление проекта для балансировки работ */
|
||||||
procedure JB_PRJCTS_BASE_INSERT
|
procedure JB_PRJCTS_BASE_INSERT
|
||||||
(
|
(
|
||||||
@ -4173,18 +4215,6 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
(NJB_PRJCTS, NIDENT, NPROJECT, NJOBS, NEDITABLE, NCHANGED);
|
(NJB_PRJCTS, NIDENT, NPROJECT, NJOBS, NEDITABLE, NCHANGED);
|
||||||
end JB_PRJCTS_BASE_INSERT;
|
end JB_PRJCTS_BASE_INSERT;
|
||||||
|
|
||||||
/* Установка признака наличия изменений проекта, требующих сохранения */
|
|
||||||
procedure JB_PRJCTS_SET_CHANGED
|
|
||||||
(
|
|
||||||
NJB_PRJCTS in number, -- Рег. номер записи списка балансируемых проектов
|
|
||||||
NCHANGED in number -- Признак наличия изменений, требующих сохранения (0 - нет, 1 - да)
|
|
||||||
)
|
|
||||||
is
|
|
||||||
begin
|
|
||||||
/* Установим признак */
|
|
||||||
update P8PNL_JB_PRJCTS T set T.CHANGED = NCHANGED where T.RN = NJB_PRJCTS;
|
|
||||||
end JB_PRJCTS_SET_CHANGED;
|
|
||||||
|
|
||||||
/* Получение списка проектов */
|
/* Получение списка проектов */
|
||||||
procedure JB_PRJCTS_LIST
|
procedure JB_PRJCTS_LIST
|
||||||
(
|
(
|
||||||
@ -4281,6 +4311,18 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
COALESCE(TO_CHAR(NSOURCE), '<НЕ УКАЗАН>'));
|
COALESCE(TO_CHAR(NSOURCE), '<НЕ УКАЗАН>'));
|
||||||
end JB_JOBS_GET_BY_SOURCE;
|
end JB_JOBS_GET_BY_SOURCE;
|
||||||
|
|
||||||
|
/* Установка признака наличия изменений балансируемой работы/этапа, требующих сохранения */
|
||||||
|
procedure JB_JOBS_SET_CHANGED
|
||||||
|
(
|
||||||
|
NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа
|
||||||
|
NCHANGED in number -- Признак наличия изменений, требующих сохранения (0 - нет, 1 - да)
|
||||||
|
)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
/* Установим признак */
|
||||||
|
update P8PNL_JB_JOBS T set T.CHANGED = NCHANGED where T.RN = NJB_JOBS;
|
||||||
|
end JB_JOBS_SET_CHANGED;
|
||||||
|
|
||||||
/* Базовое добавление работы/этапа для балансировки работ */
|
/* Базовое добавление работы/этапа для балансировки работ */
|
||||||
procedure JB_JOBS_BASE_INSERT
|
procedure JB_JOBS_BASE_INSERT
|
||||||
(
|
(
|
||||||
@ -4309,6 +4351,103 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
(NJB_JOBS, NIDENT, NPRN, NHRN, NSOURCE, SNUMB, SNAME, DDATE_FROM, DDATE_TO, NDURATION, SEXECUTOR, NSTAGE, NEDITABLE);
|
(NJB_JOBS, NIDENT, NPRN, NHRN, NSOURCE, SNUMB, SNAME, DDATE_FROM, DDATE_TO, NDURATION, SEXECUTOR, NSTAGE, NEDITABLE);
|
||||||
end JB_JOBS_BASE_INSERT;
|
end JB_JOBS_BASE_INSERT;
|
||||||
|
|
||||||
|
/* Базовое изменением сроков работы в буфере балансировки */
|
||||||
|
procedure JB_JOBS_BASE_MODIFY_PERIOD
|
||||||
|
(
|
||||||
|
NJB_JOBS in number, -- Рег. номер записи балансируемой работы/этапа
|
||||||
|
NDELTA in number, -- Изменение срока работы
|
||||||
|
NCHANGE_FLAG in number, -- Флаг изменения данных (1 - изменять дату начала, 2 - изменять дату окончания)
|
||||||
|
DFACT in date, -- Факт по состоянию на
|
||||||
|
NDURATION_MEAS in number -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
|
||||||
|
)
|
||||||
|
is
|
||||||
|
RJ PROJECTJOB%rowtype; -- Запись работы в проекте
|
||||||
|
RS PROJECTSTAGE%rowtype; -- Запись этапа в проекте
|
||||||
|
RJB_J P8PNL_JB_JOBS%rowtype; -- Запись работы в буфере балансировки
|
||||||
|
DDATE_FROM_NEW PKG_STD.TLDATE; -- Новая дата начала работы
|
||||||
|
DDATE_TO_NEW PKG_STD.TLDATE; -- Новая дата окончания работы
|
||||||
|
begin
|
||||||
|
/* Считаем работу из буфера */
|
||||||
|
RJB_J := JB_JOBS_GET(NJB_JOBS => NJB_JOBS);
|
||||||
|
/* Считаем работу проекта */
|
||||||
|
RJ := JOBS_GET(NRN => RJB_J.SOURCE);
|
||||||
|
/* Проверки - работа должна быть привязана к этапу */
|
||||||
|
if (RJ.PROJECTSTAGE is null) then
|
||||||
|
P_EXCEPTION(0,
|
||||||
|
'Работа "%s" должа быть привязана к этапу проекта.',
|
||||||
|
trim(RJ.NUMB));
|
||||||
|
end if;
|
||||||
|
/* Считаем этап проекта */
|
||||||
|
RS := STAGES_GET(NRN => RJ.PROJECTSTAGE);
|
||||||
|
/* Проверки - работа должна иметь фиксированную длительность */
|
||||||
|
if (RJ.DURATION_CHG <> 2) then
|
||||||
|
P_EXCEPTION(0,
|
||||||
|
'Работа "%s" должна иметь фиксированную длительность.',
|
||||||
|
trim(RJ.NUMB));
|
||||||
|
end if;
|
||||||
|
/* Проверки - работа должна быть в состоянии отличном от "Неначата" */
|
||||||
|
if (RJ.STATE <> 0) then
|
||||||
|
P_EXCEPTION(0,
|
||||||
|
'Работа "%s" должна быть в состоянии "Не начата".',
|
||||||
|
trim(RJ.NUMB));
|
||||||
|
end if;
|
||||||
|
/* Вычислим новую дату начала и окончания для работы */
|
||||||
|
if (NCHANGE_FLAG = 1) then
|
||||||
|
DDATE_FROM_NEW := RJB_J.DATE_FROM + NDELTA;
|
||||||
|
P_PROJECTJOB_GET_OFFSET_DATE(NCOMPANY => RJ.COMPANY,
|
||||||
|
DSRC_DATE => DDATE_FROM_NEW,
|
||||||
|
NOFFSET => RJ.DURATION_P,
|
||||||
|
NOFFSET_MEAS => NDURATION_MEAS,
|
||||||
|
DDEST_DATE => DDATE_TO_NEW);
|
||||||
|
else
|
||||||
|
DDATE_TO_NEW := RJB_J.DATE_TO + NDELTA;
|
||||||
|
P_PROJECTJOB_GET_OFFSET_DATE(NCOMPANY => RJ.COMPANY,
|
||||||
|
DSRC_DATE => DDATE_TO_NEW,
|
||||||
|
NOFFSET => -RJ.DURATION_P,
|
||||||
|
NOFFSET_MEAS => NDURATION_MEAS,
|
||||||
|
DDEST_DATE => DDATE_FROM_NEW);
|
||||||
|
end if;
|
||||||
|
/* Проверки - дата начала работы не должна быть меньше даты факта */
|
||||||
|
if ((NCHANGE_FLAG = 1) and (DDATE_FROM_NEW <= DFACT)) then
|
||||||
|
P_EXCEPTION(0,
|
||||||
|
'Работа не может начинаться раньше даты "Факт по состоянию на" (%s).',
|
||||||
|
TO_CHAR(DFACT, 'DD.MM.YYYY'));
|
||||||
|
end if;
|
||||||
|
/* Проверки - дата окончания работы не должна быть меньше даты факта */
|
||||||
|
if ((NCHANGE_FLAG = 2) and (DDATE_TO_NEW <= DFACT)) then
|
||||||
|
P_EXCEPTION(0,
|
||||||
|
'Работа не может заканчиваться раньше даты "Факт по состоянию на" (%s).',
|
||||||
|
TO_CHAR(DFACT, 'DD.MM.YYYY'));
|
||||||
|
end if;
|
||||||
|
/* Проверки - дата окончания работы не должна быть больше даты окончания этапа */
|
||||||
|
if ((NCHANGE_FLAG = 2) and (DDATE_TO_NEW >= RS.ENDPLAN)) then
|
||||||
|
P_EXCEPTION(0,
|
||||||
|
'Работа не может заканчиваться после даты завершения этапа (%s).',
|
||||||
|
TO_CHAR(RS.ENDPLAN, 'DD.MM.YYYY'));
|
||||||
|
end if;
|
||||||
|
/* Изменяем работу */
|
||||||
|
update P8PNL_JB_JOBS T
|
||||||
|
set T.DATE_FROM = DDATE_FROM_NEW,
|
||||||
|
T.DATE_TO = DDATE_TO_NEW
|
||||||
|
where T.RN = RJB_J.RN;
|
||||||
|
/* Установим признак наличия изменений */
|
||||||
|
JB_JOBS_SET_CHANGED(NJB_JOBS => RJB_J.RN, NCHANGED => 1);
|
||||||
|
/* Обходим зависимые работы с фиксированной длительностью и меняем их */
|
||||||
|
for C in (select J.RN
|
||||||
|
from P8PNL_JB_JOBS J
|
||||||
|
where J.RN in (select PRV.PRN
|
||||||
|
from P8PNL_JB_JOBSPREV PRV
|
||||||
|
where PRV.IDENT = RJB_J.IDENT
|
||||||
|
and PRV.JB_JOBS = RJB_J.RN))
|
||||||
|
loop
|
||||||
|
JB_JOBS_BASE_MODIFY_PERIOD(NJB_JOBS => C.RN,
|
||||||
|
NDELTA => NDELTA,
|
||||||
|
NCHANGE_FLAG => NCHANGE_FLAG,
|
||||||
|
DFACT => DFACT,
|
||||||
|
NDURATION_MEAS => NDURATION_MEAS);
|
||||||
|
end loop;
|
||||||
|
end JB_JOBS_BASE_MODIFY_PERIOD;
|
||||||
|
|
||||||
/* Изменение сроков работы в буфере балансировки */
|
/* Изменение сроков работы в буфере балансировки */
|
||||||
procedure JB_JOBS_MODIFY_PERIOD
|
procedure JB_JOBS_MODIFY_PERIOD
|
||||||
(
|
(
|
||||||
@ -4316,25 +4455,61 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
DDATE_FROM in date, -- Новая дата начала
|
DDATE_FROM in date, -- Новая дата начала
|
||||||
DDATE_TO in date, -- Новая дата окончания
|
DDATE_TO in date, -- Новая дата окончания
|
||||||
DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов
|
DBEGIN in date, -- Дата начала периода мониторинга загрузки ресурсов
|
||||||
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
|
DFACT in date, -- Факт по состоянию на
|
||||||
|
NDURATION_MEAS in number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
|
||||||
|
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения, -1 - ничего не изменяли)
|
||||||
)
|
)
|
||||||
is
|
is
|
||||||
RJB_J P8PNL_JB_JOBS%rowtype; -- Запись работы в буфере балансировки
|
RJB_J P8PNL_JB_JOBS%rowtype; -- Запись работы в буфере балансировки
|
||||||
RJB_P P8PNL_JB_PRJCTS%rowtype; -- Запись родительского проекта в буфере балансировки
|
RJB_P P8PNL_JB_PRJCTS%rowtype; -- Запись родительского проекта в буфере балансировки
|
||||||
|
RJ PROJECTJOB%rowtype; -- Запись работы в проекте
|
||||||
|
NCHANGE_FLAG PKG_STD.TNUMBER := 0; -- Флаг изменения данных (0 - нечего менять, 1 - дата начала изменилась, 2 - дата окончания изменилась)
|
||||||
|
NDELTA PKG_STD.TNUMBER; -- Изменение даты
|
||||||
|
SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса
|
||||||
begin
|
begin
|
||||||
/* Считаем работу из буфера */
|
/* Считаем работу из буфера */
|
||||||
RJB_J := JB_JOBS_GET(NJB_JOBS => NJB_JOBS);
|
RJB_J := JB_JOBS_GET(NJB_JOBS => NJB_JOBS);
|
||||||
/* Считаем проект из буфера */
|
/* Считаем проект из буфера */
|
||||||
RJB_P := JB_PRJCTS_GET(NJB_PRJCTS => RJB_J.PRN);
|
RJB_P := JB_PRJCTS_GET(NJB_PRJCTS => RJB_J.PRN);
|
||||||
/* Изменим работу */
|
/* Считаем работу проекта */
|
||||||
update P8PNL_JB_JOBS T
|
RJ := JOBS_GET(NRN => RJB_J.SOURCE);
|
||||||
set T.DATE_FROM = DDATE_FROM,
|
/* Проверки - это должна быть работа */
|
||||||
T.DATE_TO = DDATE_TO
|
if (RJB_J.STAGE = 1) then
|
||||||
where T.RN = RJB_J.RN;
|
P_EXCEPTION(0, 'Изменение сроков допустимо только для работ.');
|
||||||
|
end if;
|
||||||
|
/* Проверки - пользователь должен быть ответственным за проект */
|
||||||
|
if (CHECK_RESPONSIBLE(NRN => RJB_P.PROJECT, SAUTHID => SUTILIZER) <> 1) then
|
||||||
|
P_EXCEPTION(0, 'Вы не являетесь ответственным за данный проект.');
|
||||||
|
end if;
|
||||||
|
/* Проверки - работа должна иметь фиксированную длительность */
|
||||||
|
if (RJ.DURATION_CHG <> 2) then
|
||||||
|
P_EXCEPTION(0, 'Работа должна иметь фиксированную длительность.');
|
||||||
|
end if;
|
||||||
|
/* Определимся с тем, что будем менять и на сколько */
|
||||||
|
if ((DDATE_FROM is not null) and (TRUNC(RJB_J.DATE_FROM) <> TRUNC(DDATE_FROM))) then
|
||||||
|
NCHANGE_FLAG := 1;
|
||||||
|
NDELTA := TRUNC(DDATE_FROM) - TRUNC(RJB_J.DATE_FROM);
|
||||||
|
end if;
|
||||||
|
if ((DDATE_TO is not null) and (TRUNC(RJB_J.DATE_TO) <> TRUNC(DDATE_TO)) and (NCHANGE_FLAG = 0)) then
|
||||||
|
NCHANGE_FLAG := 2;
|
||||||
|
NDELTA := TRUNC(DDATE_TO) - TRUNC(RJB_J.DATE_TO);
|
||||||
|
end if;
|
||||||
|
/* Если есть что менять */
|
||||||
|
if (NCHANGE_FLAG <> 0) then
|
||||||
|
/* Изменяем работы */
|
||||||
|
JB_JOBS_BASE_MODIFY_PERIOD(NJB_JOBS => RJB_J.RN,
|
||||||
|
NDELTA => NDELTA,
|
||||||
|
NCHANGE_FLAG => NCHANGE_FLAG,
|
||||||
|
DFACT => DFACT,
|
||||||
|
NDURATION_MEAS => NDURATION_MEAS);
|
||||||
/* Выставим признак изменений в проекте */
|
/* Выставим признак изменений в проекте */
|
||||||
JB_PRJCTS_SET_CHANGED(NJB_PRJCTS => RJB_P.RN, NCHANGED => 1);
|
JB_PRJCTS_SET_CHANGED(NJB_PRJCTS => RJB_P.RN, NCHANGED => 1);
|
||||||
/* Выполним пересчёт монитора */
|
/* Выполним пересчёт монитора */
|
||||||
JB_PERIODS_RECALC(NIDENT => RJB_P.IDENT, DBEGIN => DBEGIN, NINITIAL => 0, NRESOURCE_STATUS => NRESOURCE_STATUS);
|
JB_PERIODS_RECALC(NIDENT => RJB_P.IDENT, DBEGIN => DBEGIN, NINITIAL => 0, NRESOURCE_STATUS => NRESOURCE_STATUS);
|
||||||
|
else
|
||||||
|
/* Ничего не изменили */
|
||||||
|
NRESOURCE_STATUS := -1;
|
||||||
|
end if;
|
||||||
end JB_JOBS_MODIFY_PERIOD;
|
end JB_JOBS_MODIFY_PERIOD;
|
||||||
|
|
||||||
/* Получение списка работ проектов для диаграммы Ганта */
|
/* Получение списка работ проектов для диаграммы Ганта */
|
||||||
@ -4362,7 +4537,7 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
RG PKG_P8PANELS_VISUAL.TGANTT; -- Описание диаграммы Ганта
|
RG PKG_P8PANELS_VISUAL.TGANTT; -- Описание диаграммы Ганта
|
||||||
RGT PKG_P8PANELS_VISUAL.TGANTT_TASK; -- Описание задачи для диаграммы
|
RGT PKG_P8PANELS_VISUAL.TGANTT_TASK; -- Описание задачи для диаграммы
|
||||||
STITLE PKG_STD.TSTRING; -- Общий заголовок
|
STITLE PKG_STD.TSTRING; -- Общий заголовок
|
||||||
BREAD_ONLY boolean := false; -- Флаг доступности проекта только для чтения
|
BREAD_ONLY_DATES boolean := false; -- Флаг доступности дат проекта только для чтения
|
||||||
BTASK_READ_ONLY boolean; -- Флаг доступности задачи только для чтения
|
BTASK_READ_ONLY boolean; -- Флаг доступности задачи только для чтения
|
||||||
STASK_BG_COLOR PKG_STD.TSTRING; -- Цвет фона задачи
|
STASK_BG_COLOR PKG_STD.TSTRING; -- Цвет фона задачи
|
||||||
STASK_TEXT_COLOR PKG_STD.TSTRING; -- Цвет текста задачи
|
STASK_TEXT_COLOR PKG_STD.TSTRING; -- Цвет текста задачи
|
||||||
@ -4377,7 +4552,7 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
RPRJ := GET(NRN => RJB_PRJ.PROJECT);
|
RPRJ := GET(NRN => RJB_PRJ.PROJECT);
|
||||||
/* Определимся с возможностью изменения данных проекта */
|
/* Определимся с возможностью изменения данных проекта */
|
||||||
if (RJB_PRJ.EDITABLE = 0) then
|
if (RJB_PRJ.EDITABLE = 0) then
|
||||||
BREAD_ONLY := true;
|
BREAD_ONLY_DATES := true;
|
||||||
end if;
|
end if;
|
||||||
/* Сформируем общий заголовок */
|
/* Сформируем общий заголовок */
|
||||||
STITLE := RPRJ.NAME_USL || ' - ' || RPRJ.NAME;
|
STITLE := RPRJ.NAME_USL || ' - ' || RPRJ.NAME;
|
||||||
@ -4396,7 +4571,8 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
/* Инициализируем диаграмму Ганта */
|
/* Инициализируем диаграмму Ганта */
|
||||||
RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => STITLE,
|
RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => STITLE,
|
||||||
NZOOM => PKG_P8PANELS_VISUAL.NGANTT_ZOOM_MONTH,
|
NZOOM => PKG_P8PANELS_VISUAL.NGANTT_ZOOM_MONTH,
|
||||||
BREAD_ONLY => BREAD_ONLY);
|
BREAD_ONLY_DATES => BREAD_ONLY_DATES,
|
||||||
|
BREAD_ONLY_PROGRESS => true);
|
||||||
/* Добавим динамические атрибуты к задачам */
|
/* Добавим динамические атрибуты к задачам */
|
||||||
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => 'type', SCAPTION => 'Тип');
|
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => 'type', SCAPTION => 'Тип');
|
||||||
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => 'state', SCAPTION => 'Состояние');
|
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => 'state', SCAPTION => 'Состояние');
|
||||||
@ -5354,7 +5530,7 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
/* Очистка данных балансировки */
|
/* Очистка данных балансировки */
|
||||||
procedure JB_CLEAN
|
procedure JB_CLEAN
|
||||||
(
|
(
|
||||||
NIDENT in number -- Идентификатор буфера сформированных данных
|
NIDENT in number -- Идентификатор процесса
|
||||||
)
|
)
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
@ -5376,6 +5552,95 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
JB_PERIODS_CLEAN(NIDENT => NIDENT);
|
JB_PERIODS_CLEAN(NIDENT => NIDENT);
|
||||||
end JB_CLEAN;
|
end JB_CLEAN;
|
||||||
|
|
||||||
|
/* Перенос данных буфера балансировки в проекты */
|
||||||
|
procedure JB_SAVE
|
||||||
|
(
|
||||||
|
NIDENT in number, -- Идентификатор процесса
|
||||||
|
COUT out clob -- Список проектов
|
||||||
|
)
|
||||||
|
is
|
||||||
|
NJH PKG_STD.TREF; -- Рег. номер записи истории изменения работы
|
||||||
|
begin
|
||||||
|
/* Обходим изменённые проекты буфера */
|
||||||
|
for P in (select T.*
|
||||||
|
from P8PNL_JB_PRJCTS T
|
||||||
|
where T.IDENT = NIDENT
|
||||||
|
and T.CHANGED = 1)
|
||||||
|
loop
|
||||||
|
/* Обходим изменённые работы проекта */
|
||||||
|
for J in (select T.*
|
||||||
|
from P8PNL_JB_JOBS T
|
||||||
|
where T.IDENT = NIDENT
|
||||||
|
and T.PRN = P.RN
|
||||||
|
and T.STAGE = 0
|
||||||
|
and T.CHANGED = 1)
|
||||||
|
loop
|
||||||
|
/* Меняем работу в проекте */
|
||||||
|
for PJ in (select T.* from PROJECTJOB T where T.RN = J.SOURCE)
|
||||||
|
loop
|
||||||
|
P_PROJECTJOB_BASE_UPDATE(NRN => PJ.RN,
|
||||||
|
NCOMPANY => PJ.COMPANY,
|
||||||
|
NJUR_PERS => PJ.JUR_PERS,
|
||||||
|
NPROJECTSTAGE => PJ.PROJECTSTAGE,
|
||||||
|
NFACEACC => PJ.FACEACC,
|
||||||
|
SNUMB => PJ.NUMB,
|
||||||
|
SBUDG_NUMB => PJ.BUDG_NUMB,
|
||||||
|
SNAME => PJ.NAME,
|
||||||
|
NPRJOB => PJ.PRJOB,
|
||||||
|
NPRIORITY => PJ.PRIORITY,
|
||||||
|
NRESTRICTION => PJ.RESTRICTION,
|
||||||
|
DRESTRICT_DATE => PJ.RESTRICT_DATE,
|
||||||
|
NDURATION_CHG => PJ.DURATION_CHG,
|
||||||
|
NDURATION_NRM => PJ.DURATION_NRM,
|
||||||
|
NDURATION_MEAS => PJ.DURATION_MEAS,
|
||||||
|
NDURATION_P => PJ.DURATION_P,
|
||||||
|
NDURATION_F => PJ.DURATION_F,
|
||||||
|
NSUBDIV => PJ.SUBDIV,
|
||||||
|
NPERFORM => PJ.PERFORM,
|
||||||
|
NRELEASE => PJ.RELEASE,
|
||||||
|
NVOLUME_P => PJ.VOLUME_P,
|
||||||
|
NVOLUME_F => PJ.VOLUME_F,
|
||||||
|
NPRICE_P => PJ.PRICE_P,
|
||||||
|
NPRICE_F => PJ.PRICE_F,
|
||||||
|
NCURNAMES => PJ.CURNAMES,
|
||||||
|
NFPDARTCL => PJ.FPDARTCL,
|
||||||
|
NCOST_PLAN => PJ.COST_PLAN,
|
||||||
|
NCOST_FACT => PJ.COST_FACT,
|
||||||
|
NCOST_BPRICE => PJ.COST_BPRICE,
|
||||||
|
NCOST_CALC => PJ.COST_CALC,
|
||||||
|
NSTATE => PJ.STATE,
|
||||||
|
NPERFORM_PRC => PJ.PERFORM_PRC,
|
||||||
|
NFINDEFLINIT => PJ.FINDEFLINIT,
|
||||||
|
DBEGPLAN => J.DATE_FROM,
|
||||||
|
DBEGFACT => PJ.BEGFACT,
|
||||||
|
DENDPLAN => J.DATE_TO,
|
||||||
|
DENDFACT => PJ.ENDFACT,
|
||||||
|
SNOTE => PJ.NOTE,
|
||||||
|
DDO_ACT_FROM => sysdate,
|
||||||
|
NRFLCT_HS => PJ.RFLCT_HS,
|
||||||
|
NLAB_NORM => PJ.LAB_NORM,
|
||||||
|
NCALC_LAB => PJ.CALC_LAB,
|
||||||
|
NLAB_PLAN_I => PJ.LAB_PLAN,
|
||||||
|
NLAB_FACT_I => PJ.LAB_FACT,
|
||||||
|
NLAB_PART => PJ.LAB_PART,
|
||||||
|
NLAB_MEAS => PJ.LAB_MEAS,
|
||||||
|
SCHNG_BASE => PJ.CHNG_BASE,
|
||||||
|
NFACEACCPERF => PJ.FACEACCPERF,
|
||||||
|
NCHECK_DO_ACT_FROM => 0,
|
||||||
|
NLAB_UNITCOST => PJ.LAB_UNITCOST,
|
||||||
|
NLAB_CURRENCY => PJ.LAB_CURRENCY);
|
||||||
|
P_PROJECTJOBHS_MAKE_HIST(NCOMPANY => PJ.COMPANY, NPRN => PJ.RN, NCHECK_HS => 0, NRN => NJH);
|
||||||
|
end loop;
|
||||||
|
/* Снимаем флаг внесения изменений в буферную работу */
|
||||||
|
JB_JOBS_SET_CHANGED(NJB_JOBS => J.RN, NCHANGED => 0);
|
||||||
|
end loop;
|
||||||
|
/* Снимаем флаг внесения изменений в буферный проект */
|
||||||
|
JB_PRJCTS_SET_CHANGED(NJB_PRJCTS => P.RN, NCHANGED => 0);
|
||||||
|
end loop;
|
||||||
|
/* Вернём пересобранный список проектов */
|
||||||
|
JB_PRJCTS_LIST(NIDENT => NIDENT, COUT => COUT);
|
||||||
|
end JB_SAVE;
|
||||||
|
|
||||||
/* Формирование исходных данных для балансировки планов-графиков работ */
|
/* Формирование исходных данных для балансировки планов-графиков работ */
|
||||||
procedure JB_INIT
|
procedure JB_INIT
|
||||||
(
|
(
|
||||||
@ -5383,13 +5648,12 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
DFACT in out date, -- Факт по состоянию на
|
DFACT in out date, -- Факт по состоянию на
|
||||||
NDURATION_MEAS in out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
|
NDURATION_MEAS in out number, -- Единица измерения длительности (0 - день, 1 - неделя, 2 - декада, 3 - месяц, 4 - квартал, 5 - год)
|
||||||
SLAB_MEAS in out varchar2, -- Единица измерения трудоёмкости
|
SLAB_MEAS in out varchar2, -- Единица измерения трудоёмкости
|
||||||
NIDENT in out number, -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
|
NIDENT in out number, -- Идентификатор процесса (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
|
||||||
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
|
NRESOURCE_STATUS out number -- Состояние ресурсов (0 - без отклонений, 1 - есть отклонения)
|
||||||
)
|
)
|
||||||
is
|
is
|
||||||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||||||
SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса
|
SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса
|
||||||
NUTILIZER_AGENT PKG_STD.TREF; -- Рег. номер контрагента текущего пользователя
|
|
||||||
NJB_PRJCTS PKG_STD.TREF; -- Рег. номер проекта в списке для балансировки
|
NJB_PRJCTS PKG_STD.TREF; -- Рег. номер проекта в списке для балансировки
|
||||||
NJB_JOBS_STAGE PKG_STD.TREF; -- Рег. номер этапа проекта в списке для балансировки
|
NJB_JOBS_STAGE PKG_STD.TREF; -- Рег. номер этапа проекта в списке для балансировки
|
||||||
NJB_JOBS_JOB PKG_STD.TREF; -- Рег. номер работы проекта в списке для балансировки
|
NJB_JOBS_JOB PKG_STD.TREF; -- Рег. номер работы проекта в списке для балансировки
|
||||||
@ -5406,19 +5670,19 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
else
|
else
|
||||||
DBEGIN := TRUNC(DBEGIN, 'yyyy');
|
DBEGIN := TRUNC(DBEGIN, 'yyyy');
|
||||||
end if;
|
end if;
|
||||||
|
/* Обработаем дату факта */
|
||||||
|
DFACT := TO_DATE('01.01.2022', 'DD.MM.YYYY');
|
||||||
/* Обработаем единицу измерения длительности (пока - она всегда должна быть "день", по умолчанию) */
|
/* Обработаем единицу измерения длительности (пока - она всегда должна быть "день", по умолчанию) */
|
||||||
NDURATION_MEAS := NJB_DURATION_MEAS;
|
NDURATION_MEAS := NJB_DURATION_MEAS;
|
||||||
/* Обработаем единицу измерения трудоёмкости (пока - она всегда должна быть "ч/ч", по умолчанию) */
|
/* Обработаем единицу измерения трудоёмкости (пока - она всегда должна быть "ч/ч", по умолчанию) */
|
||||||
SLAB_MEAS := SJB_LAB_MEAS;
|
SLAB_MEAS := SJB_LAB_MEAS;
|
||||||
FIND_DICMUNTS_BY_MNEMO(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, SMEAS_MNEMO => SLAB_MEAS, NRN => NLAB_MEAS);
|
FIND_DICMUNTS_BY_MNEMO(NFLAG_SMART => 0, NCOMPANY => NCOMPANY, SMEAS_MNEMO => SLAB_MEAS, NRN => NLAB_MEAS);
|
||||||
/* Отработаем идентификатор буфера */
|
/* Отработаем идентификатор процесса */
|
||||||
if (NIDENT is null) then
|
if (NIDENT is null) then
|
||||||
NIDENT := GEN_IDENT();
|
NIDENT := GEN_IDENT();
|
||||||
else
|
else
|
||||||
JB_CLEAN(NIDENT => NIDENT);
|
JB_CLEAN(NIDENT => NIDENT);
|
||||||
end if;
|
end if;
|
||||||
/* Найдем контрагента, соответствующего текущему пользователю */
|
|
||||||
FIND_AGNLIST_AUTHID(NFLAG_OPTION => 1, NCOMPANY => NCOMPANY, SPERS_AUTHID => SUTILIZER, NAGENT => NUTILIZER_AGENT);
|
|
||||||
/* Обходим проекты */
|
/* Обходим проекты */
|
||||||
for PRJ in (select P.RN NRN,
|
for PRJ in (select P.RN NRN,
|
||||||
COALESCE((select 1
|
COALESCE((select 1
|
||||||
@ -5432,11 +5696,7 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
and PS.ENDPLAN is not null
|
and PS.ENDPLAN is not null
|
||||||
and ROWNUM <= 1),
|
and ROWNUM <= 1),
|
||||||
0) NJOBS,
|
0) NJOBS,
|
||||||
COALESCE((select 1
|
0 NEDITABLE,
|
||||||
from AGNLIST AG
|
|
||||||
where AG.RN = P.RESPONSIBLE
|
|
||||||
and AG.RN = NUTILIZER_AGENT),
|
|
||||||
0) NEDITABLE,
|
|
||||||
P.BEGPLAN DBEGPLAN,
|
P.BEGPLAN DBEGPLAN,
|
||||||
P.ENDPLAN DENDPLAN
|
P.ENDPLAN DENDPLAN
|
||||||
from PROJECT P
|
from PROJECT P
|
||||||
@ -5449,6 +5709,10 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
and UP.UNITCODE = 'Projects')
|
and UP.UNITCODE = 'Projects')
|
||||||
order by P.NAME_USL)
|
order by P.NAME_USL)
|
||||||
loop
|
loop
|
||||||
|
/* Установим признак доступности редактирования */
|
||||||
|
if (CHECK_RESPONSIBLE(NRN => PRJ.NRN, SAUTHID => SUTILIZER) = 1) then
|
||||||
|
PRJ.NEDITABLE := 1;
|
||||||
|
end if;
|
||||||
/* Помещаем проект в список балансируемых */
|
/* Помещаем проект в список балансируемых */
|
||||||
JB_PRJCTS_BASE_INSERT(NIDENT => NIDENT,
|
JB_PRJCTS_BASE_INSERT(NIDENT => NIDENT,
|
||||||
NPROJECT => PRJ.NRN,
|
NPROJECT => PRJ.NRN,
|
||||||
@ -5513,7 +5777,8 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
J.BEGPLAN DBEGPLAN,
|
J.BEGPLAN DBEGPLAN,
|
||||||
J.ENDPLAN DENDPLAN,
|
J.ENDPLAN DENDPLAN,
|
||||||
COALESCE(COALESCE(DP.CODE, AG.AGNABBR), STG.SEXECUTOR) SEXECUTOR,
|
COALESCE(COALESCE(DP.CODE, AG.AGNABBR), STG.SEXECUTOR) SEXECUTOR,
|
||||||
J.STATE NSTATE
|
J.STATE NSTATE,
|
||||||
|
J.DURATION_CHG NDURATION_CHG
|
||||||
from PROJECTJOB J,
|
from PROJECTJOB J,
|
||||||
AGNLIST AG,
|
AGNLIST AG,
|
||||||
INS_DEPARTMENT DP
|
INS_DEPARTMENT DP
|
||||||
@ -5528,7 +5793,7 @@ text="Проверить, что для расчётных полей дата-
|
|||||||
loop
|
loop
|
||||||
/* Определим возможность редактирования работы */
|
/* Определим возможность редактирования работы */
|
||||||
NEDITABLE := 1;
|
NEDITABLE := 1;
|
||||||
if ((PRJ.NEDITABLE = 0) or (PJ.NSTATE not in (0, 1))) then
|
if ((PRJ.NEDITABLE = 0) or (PJ.NSTATE <> 0) or (PJ.NDURATION_CHG <> 2)) then
|
||||||
NEDITABLE := 0;
|
NEDITABLE := 0;
|
||||||
end if;
|
end if;
|
||||||
/* Определим длительность работы */
|
/* Определим длительность работы */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user