diff --git a/app/panels/mech_rec_cost_prod_plans/hooks.js b/app/panels/mech_rec_cost_prod_plans/hooks.js
index 3cf45a9..926fc8a 100644
--- a/app/panels/mech_rec_cost_prod_plans/hooks.js
+++ b/app/panels/mech_rec_cost_prod_plans/hooks.js
@@ -14,10 +14,10 @@ import React from "react"; //Классы React
//-----------
//Клиентский отбор загруженных планов по поисковой фразе
-export const useFilteredPlans = (plans, filter) => {
- const filteredPlans = React.useMemo(() => {
- return plans.filter(project => project.SDOC_INFO.toLowerCase().includes(filter));
- }, [plans, filter]);
+export const useFilteredPlanCtlgs = (planCtlgs, filter) => {
+ const filteredPlanCtlgs = React.useMemo(() => {
+ return planCtlgs.filter(catalog => catalog.SNAME.toString().toLowerCase().includes(filter));
+ }, [planCtlgs, filter]);
- return filteredPlans;
+ return filteredPlanCtlgs;
};
diff --git a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
index 0218ff8..bb2a489 100644
--- a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
+++ b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
@@ -12,18 +12,21 @@ import PropTypes from "prop-types"; //Контроль свойств компо
import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, Grid, TextField, Select, MenuItem, InputLabel } from "@mui/material"; //Интерфейсные элементы
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
-import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { P8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта
import { xml2JSON, formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции
-import { useFilteredPlans } from "./hooks"; //Вспомогательные хуки
+import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки
//---------
//Константы
//---------
+//Поля сортировки
+const SORT_REP_DATE = "DREP_DATE";
+const SORT_REP_DATE_TO = "DREP_DATE_TO";
+
//Высота диаграммы Ганта
-const GANTT_HEIGHT = "650px";
+const GANTT_HEIGHT = "75vh";
//Ширина диаграммы Ганта
const GANTT_WIDTH = "98vw";
@@ -56,8 +59,8 @@ const parseProdPlanSpXML = async xmlDoc => {
return data.XDATA;
};
-//Список планов
-const PlansList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}) => {
+//Список каталогов планов
+const PlanCtlgsList = ({ planCtlgs = [], selectedPlanCtlg, filter, setFilter, onClick } = {}) => {
//Генерация содержимого
return (
@@ -73,9 +76,9 @@ const PlansList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}
}}
>
- {plans.map(p => (
- (onClick ? onClick(p) : null)}>
- {p.SDOC_INFO}} />
+ {planCtlgs.map(p => (
+ (onClick ? onClick(p) : null)}>
+ {p.SNAME}} />
))}
@@ -83,10 +86,10 @@ const PlansList = ({ plans = [], selectedPlan, filter, setFilter, onClick } = {}
);
};
-//Контроль свойств - Список планов
-PlansList.propTypes = {
- plans: PropTypes.array,
- selectedPlan: PropTypes.number,
+//Контроль свойств - Список каталогов планов
+PlanCtlgsList.propTypes = {
+ planCtlgs: PropTypes.array,
+ selectedPlanCtlg: PropTypes.number,
onClick: PropTypes.func,
filter: PropTypes.string,
setFilter: PropTypes.func
@@ -102,23 +105,21 @@ const MechRecCostProdPlans = () => {
let [state, setState] = useState({
init: false,
showPlanList: false,
- plans: [],
- plansLoaded: false,
- selectedPlanSpecsLoaded: false,
- selectedPlan: null,
- selectedPlanMaxLevel: null,
- selectedPlanLevel: null,
- selectedPlanMenuItems: null,
- selectedPlanGanttDef: {},
- selectedPlanSpecs: []
+ planCtlgs: [],
+ planCtlgsLoaded: false,
+ selectedPlanCtlgSpecsLoaded: false,
+ selectedPlanCtlg: null,
+ selectedPlanCtlgMaxLevel: null,
+ selectedPlanCtlgLevel: null,
+ selectedPlanCtlgSort: null,
+ selectedPlanCtlgMenuItems: null,
+ selectedPlanCtlgGanttDef: {},
+ selectedPlanCtlgSpecs: []
});
const [filter, setFilter] = useState("");
- const filteredPlans = useFilteredPlans(state.plans, filter);
-
- //Подключение к контексту приложения
- const { pOnlineShowDocument } = useContext(ApplicationСtx);
+ const filteredPlanCtgls = useFilteredPlanCtlgs(state.planCtlgs, filter);
//Подключение к контексту сообщений
const { InlineMsgInfo } = useContext(MessagingСtx);
@@ -126,106 +127,110 @@ const MechRecCostProdPlans = () => {
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
- // Инициализация планов
- const initPlans = useCallback(async () => {
+ // Инициализация каталогов планов
+ const initPlanCtlgs = useCallback(async () => {
if (!state.init) {
const data = await executeStored({
- stored: "PKG_P8PANELS_MECHREC.PRODPLAN_INIT",
+ stored: "PKG_P8PANELS_MECHREC.ACATALOG_INIT",
args: {},
respArg: "COUT",
- isArray: name => name === "XFCPRODPLANS"
+ isArray: name => name === "XFCPRODPLAN_CRNS"
});
- setState(pv => ({ ...pv, init: true, plans: [...(data?.XFCPRODPLANS || [])], plansLoaded: true }));
+ setState(pv => ({ ...pv, init: true, planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])], planCtlgsLoaded: true }));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [state.init, executeStored]);
- //Выбор плана
+ //Выбор каталога планов
const selectPlan = project => {
setState(pv => ({
...pv,
- selectedPlan: project,
- selectedPlanSpecsLoaded: false,
- selectedPlanMaxLevel: null,
- selectedPlanLevel: null,
- selectedPlanMenuItems: null,
- selectedPlanSpecs: [],
- selectedPlanGanttDef: {},
+ selectedPlanCtlg: project,
+ selectedPlanCtlgSpecsLoaded: false,
+ selectedPlanCtlgMaxLevel: null,
+ selectedPlanCtlgLevel: null,
+ selectedPlanCtlgSort: null,
+ selectedPlanCtlgMenuItems: null,
+ selectedPlanCtlgSpecs: [],
+ selectedPlanCtlgGanttDef: {},
showPlanList: false
}));
};
- //Сброс выбора плана
+ //Сброс выбора каталога планов
const unselectPlan = () =>
setState(pv => ({
...pv,
- selectedPlanSpecsLoaded: false,
- selectedPlan: null,
- selectedPlanMaxLevel: null,
- selectedPlanLevel: null,
- selectedPlanMenuItems: null,
- selectedPlanSpecs: [],
- selectedPlanGanttDef: {},
+ selectedPlanCtlgSpecsLoaded: false,
+ selectedPlanCtlg: null,
+ selectedPlanCtlgMaxLevel: null,
+ selectedPlanCtlgLevel: null,
+ selectedPlanCtlgSort: null,
+ selectedPlanCtlgMenuItems: null,
+ selectedPlanCtlgSpecs: [],
+ selectedPlanCtlgGanttDef: {},
showPlanList: false
}));
- //Загрузка списка спецификаций плана
- const loadPlanSpecs = useCallback(
- async (level = null) => {
+ //Загрузка списка спецификаций каталога планов
+ const loadPlanCtglSpecs = useCallback(
+ async (level = null, sort = null) => {
const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET",
- args: { NFCPRODPLAN: state.selectedPlan, NLEVEL: level }
+ args: { NCRN: state.selectedPlanCtlg, NLEVEL: level, SSORT_FIELD: sort }
});
let doc = await parseProdPlanSpXML(data.COUT);
setState(pv => ({
...pv,
- selectedPlanMaxLevel: data.NMAX_LEVEL,
- selectedPlanLevel: level || level === 0 ? level : data.NMAX_LEVEL,
- selectedPlanMenuItems: state.selectedPlanMenuItems
- ? state.selectedPlanMenuItems
+ selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,
+ selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,
+ selectedPlanCtlgSort: sort,
+ selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems
+ ? state.selectedPlanCtlgMenuItems
: [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),
- selectedPlanSpecsLoaded: true,
- selectedPlanGanttDef: doc.XGANTT_DEF ? { ...doc.XGANTT_DEF } : {},
- selectedPlanSpecs: [...(doc?.XGANTT_TASKS || [])]
+ selectedPlanCtlgSpecsLoaded: true,
+ selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? { ...doc.XGANTT_DEF } : {},
+ selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])]
}));
},
// eslint-disable-next-line react-hooks/exhaustive-deps
- [executeStored, state.ident, state.selectedPlan]
+ [executeStored, state.ident, state.selectedPlanCtlg]
);
- //Обработка нажатия на элемент в списке планов
+ //Обработка нажатия на элемент в списке каталогов планов
const handleProjectClick = project => {
- if (state.selectedPlan != project.NRN) selectPlan(project.NRN);
+ if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN);
else unselectPlan();
};
- //Отработка нажатия на заголовок плана
- const handleTitleClick = () => {
- state.selectedPlan ? pOnlineShowDocument({ unitCode: "CostProductPlans", document: state.selectedPlan }) : null;
- };
-
//При подключении компонента к странице
useEffect(() => {
- initPlans();
+ initPlanCtlgs();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
- //При смене выбранного плана
+ //При смене выбранного каталога плана
useEffect(() => {
- if (state.selectedPlan) loadPlanSpecs();
- }, [state.selectedPlan, loadPlanSpecs]);
+ if (state.selectedPlanCtlg) loadPlanCtglSpecs(null, SORT_REP_DATE_TO);
+ }, [state.selectedPlanCtlg, loadPlanCtglSpecs]);
//Выбор уровня
- const handleChangeSelectList = selectedLevel => {
- loadPlanSpecs(selectedLevel);
- setState(pv => ({ ...pv, selectedPlanLevel: selectedLevel }));
+ const handleChangeSelectLevel = selectedLevel => {
+ loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort);
+ setState(pv => ({ ...pv, selectedPlanCtlgLevel: selectedLevel }));
+ };
+
+ //Выбор сортировки
+ const handleChangeSelectSort = selectedSort => {
+ loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort);
+ setState(pv => ({ ...pv, selectedPlanCtlgSort: selectedSort }));
};
//Генерация содержимого
return (
setState(pv => ({ ...pv, showPlanList: !pv.showPlanList }))}>
- Планы
+ Каталоги планов
{
onClose={() => setState(pv => ({ ...pv, showPlanList: false }))}
sx={STYLES.PLANS_DRAWER}
>
- {
{state.init == true ? (
- {state.selectedPlanSpecsLoaded ? (
- state.selectedPlanSpecs.length === 0 ? (
-
+ {state.selectedPlanCtlgSpecsLoaded ? (
+ state.selectedPlanCtlgSpecs.length === 0 ? (
+
) : (
- {state.selectedPlanMaxLevel ? (
-
- Уровень
-
+
+
+ До уровня
+
+
- ) : null}
+ ) : //
+ null}
)
- ) : !state.selectedPlan ? (
-
+ ) : !state.selectedPlanCtlg ? (
+
) : null}
diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck
index 1e01d67..5ce95c9 100644
--- a/db/PKG_P8PANELS_MECHREC.pck
+++ b/db/PKG_P8PANELS_MECHREC.pck
@@ -1,18 +1,19 @@
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 -- Максимальный уровень иерархии
+ NCRN in number, -- Рег. номер каталога
+ NLEVEL in number := null, -- Уровень отбора
+ SSORT_FIELD in varchar2 := 'DREP_DATE_TO', -- Поле сортировки
+ COUT out clob, -- Список проектов
+ NMAX_LEVEL out number -- Максимальный уровень иерархии
);
- /* Инициализация планов и отчетов производства изделий */
- procedure PRODPLAN_INIT
+ /* Инициализация каталогов раздела "Планы и отчеты производства изделий" */
+ procedure ACATALOG_INIT
(
- COUT out clob -- Список планов и отчетов производства изделий
+ COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий"
);
end PKG_P8PANELS_MECHREC;
@@ -27,15 +28,18 @@ create or replace package body PKG_P8PANELS_MECHREC as
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 := 'План'; -- Тип планов (мнемокод состояния)
+ 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'; -- Уровень
+ STASK_ATTR_PROD_ORDER constant PKG_STD.TSTRING := 'prod_order'; -- Заказ
+ STASK_ATTR_SUBDIV_DLVR constant PKG_STD.TSTRING := 'subdiv_dlvr'; -- Сдающее подразделение
+ STASK_ATTR_MAIN_QUANT constant PKG_STD.TSTRING := 'main_quant'; -- Выпуск
+ 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
@@ -51,10 +55,18 @@ create or replace package body PKG_P8PANELS_MECHREC as
begin
/* Если дефицит запуска <> 0 */
if (NDEFRESLIZ <> 0) then
- /* Полностью красный */
- STASK_BG_COLOR := SBG_COLOR_RED;
- STASK_BG_PROGRESS_COLOR := null;
- NTASK_PROGRESS := null;
+ /* Если дефицит выпуска = 0 */
+ if (NDEFSTART = 0) then
+ /* Полностью зеленый */
+ STASK_BG_COLOR := SBG_COLOR_GREEN;
+ 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
@@ -81,48 +93,10 @@ create or replace package body PKG_P8PANELS_MECHREC as
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 -- Рег. номер плана
+ NCRN in number -- Рег. номер каталога планов
) return number -- Максимальный уровень иерархии
is
NRESULT PKG_STD.TNUMBER; -- Максимальный уровень иерархии
@@ -133,8 +107,31 @@ create or replace package body PKG_P8PANELS_MECHREC as
into NRESULT
from (select T.RN,
T.UP_LEVEL
- from FCPRODPLANSP T
- where T.PRN = NPRODPLAN) TMP
+ 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) TMP
connect by prior TMP.RN = TMP.UP_LEVEL
start with TMP.UP_LEVEL is null;
exception
@@ -185,12 +182,13 @@ create or replace package body PKG_P8PANELS_MECHREC as
end if;
end if;
end FCPRODPLANSP_DATES_GET;
-
+
/* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
procedure FCPRODPLANSP_GET
(
- NFCPRODPLAN in number, -- Рег. номер родителя
+ NCRN in number, -- Рег. номер каталога
NLEVEL in number := null, -- Уровень отбора
+ SSORT_FIELD in varchar2 := 'DREP_DATE_TO', -- Поле сортировки
COUT out clob, -- Список проектов
NMAX_LEVEL out number -- Максимальный уровень иерархии
)
@@ -205,149 +203,351 @@ create or replace package body PKG_P8PANELS_MECHREC as
NTASK_PROGRESS PKG_STD.TNUMBER; -- Прогресс выполнения задачи
DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации
DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации
+ STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ /* Значения спецификации */
+ NTASK_RN PKG_STD.TREF; -- Рег. номер спецификации
+ NTASK_PRN PKG_STD.TREF; -- Рег. номер родителя спецификации
+ STASK_PROD_ORDER PKG_STD.TSTRING; -- Заказ
+ DTASK_REP_DATE PKG_STD.TLDATE; -- Дата запуска
+ DTASK_REP_DATE_TO PKG_STD.TLDATE; -- Дата выпуска
+ DTASK_INCL_DATE PKG_STD.TLDATE; -- Дата включения в план
+ STASK_ROUTE PKG_STD.TSTRING; -- Маршрут
+ STASK_NOMEN_NAME PKG_STD.TSTRING; -- Наименование номенклатуры
+ NTASK_DEFRESLIZ number; -- Дефицит запуска
+ NTASK_REL_FACT number; -- Выпуск факт
+ NTASK_DEFSTART number; -- Дефицит выпуска
+ NTASK_MAIN_QUANT number; -- Выпуск
+ STASK_SUBDIV_DLVR PKG_STD.TSTRING; -- Сдающее подразделение
+ NTASK_HAVE_LINK PKG_STD.TNUMBER; -- Наличие ссылок (0 - нет, 1 - да)
+ NTASK_UP_LEVEL PKG_STD.TREF; -- Рег. номер родительской записи в иерархии
+ NTASK_LEVEL PKG_STD.TNUMBER; -- Уровень в иерархии
+
+ /* Объединение значений в строковое представление */
+ function MAKE_INFO
+ (
+ SPROD_ORDER in varchar2, -- Заказ
+ SNOMEN_NAME in varchar2, -- Наименование номенклатуры
+ SSUBDIV_DLVR in varchar2, -- Сдающее подразделение
+ NMAIN_QUANT in number -- Выпуск
+ ) return varchar2 -- Описание задачи в Ганте
+ is
+ SRESULT PKG_STD.TSTRING; -- Описание задачи в Ганте
+ begin
+ /* Соединяем информацию */
+ SRESULT := STRCOMBINE(SPROD_ORDER, SNOMEN_NAME, ', ');
+ SRESULT := STRCOMBINE(SRESULT, SSUBDIV_DLVR, ', ');
+ SRESULT := STRCOMBINE(SRESULT, TO_CHAR(NMAIN_QUANT), ', ');
+ /* Возвращаем результат */
+ return SRESULT;
+ end MAKE_INFO;
+
+ /* Инициализация динамических атрибутов */
+ procedure TASK_ATTRS_INIT
+ (
+ RG in out PKG_P8PANELS_VISUAL.TGANTT -- Описание диаграммы Ганта
+ )
+ is
+ begin
+ /* Добавим динамические атрибуты к спецификациям */
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_PROD_ORDER, SCAPTION => 'Заказ');
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
+ SNAME => STASK_ATTR_SUBDIV_DLVR,
+ SCAPTION => 'Сдающее подразделение');
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
+ SNAME => STASK_ATTR_MAIN_QUANT,
+ SCAPTION => 'Выпуск');
+ 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 => 'Уровень');
+ 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,
+ 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 => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
+ end TASK_COLORS_INIT;
+
+ /* Заполнение значений динамических атрибутов */
+ procedure FILL_TASK_ATTRS
+ (
+ RG in PKG_P8PANELS_VISUAL.TGANTT, -- Описание диаграммы Ганта
+ RGT in out nocopy PKG_P8PANELS_VISUAL.TGANTT_TASK, -- Описание задачи для диаграммы
+ SPROD_ORDER in varchar2, -- Заказ
+ SSUBDIV_DLVR in varchar2, -- Сдающее подразделение
+ NMAIN_QUANT in number, -- Выпуск
+ NDEFRESLIZ in number, -- Дефицит запуска
+ NREL_FACT in number, -- Выпуск факт
+ NDEFSTART in number, -- Дефицит выпуска
+ NLEVEL in number -- Уровень
+ )
+ is
+ begin
+ /* Добавим доп. атрибуты */
+ PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
+ RTASK => RGT,
+ SNAME => STASK_ATTR_PROD_ORDER,
+ SVALUE => SPROD_ORDER,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
+ RTASK => RGT,
+ SNAME => STASK_ATTR_SUBDIV_DLVR,
+ SVALUE => SSUBDIV_DLVR);
+ PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
+ RTASK => RGT,
+ SNAME => STASK_ATTR_MAIN_QUANT,
+ SVALUE => TO_CHAR(NMAIN_QUANT));
+ PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
+ RTASK => RGT,
+ SNAME => STASK_ATTR_DEFRESLIZ,
+ SVALUE => TO_CHAR(NDEFRESLIZ));
+ PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
+ RTASK => RGT,
+ SNAME => STASK_ATTR_REL_FACT,
+ SVALUE => TO_CHAR(NREL_FACT));
+ PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
+ RTASK => RGT,
+ SNAME => STASK_ATTR_DEFSTART,
+ SVALUE => TO_CHAR(NDEFSTART));
+ PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
+ RTASK => RGT,
+ SNAME => STASK_ATTR_LEVEL,
+ SVALUE => TO_CHAR(NLEVEL));
+ end FILL_TASK_ATTRS;
begin
/* Инициализируем диаграмму Ганта */
- RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => TITLE_GET(NRN => NFCPRODPLAN),
+ RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => 'Производственная программа',
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 => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
+ /* Инициализируем динамические атрибуты к спецификациям */
+ TASK_ATTRS_INIT(RG => RG);
+ /* Инициализируем описания цветов */
+ TASK_COLORS_INIT(RG => RG);
/* Определяем максимальный уровень иерархии */
- 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,
+ NMAX_LEVEL := PRODPLAN_MAX_LEVEL_GET(NCRN => NCRN);
+ /* Обходим данные */
+ begin
+ CSQL := 'select TMP.*,
+ level NTASK_LEVEL
+ from (select T.RN NRN,
+ T.PRN NPRN,
+ (select PORD.NUMB from FACEACC PORD where PORD.RN = T.PROD_ORDER) SPROD_ORDER,
+ T.REP_DATE DREP_DATE,
+ T.REP_DATE_TO DREP_DATE_TO,
+ T.INCL_DATE DINCL_DATE,
+ T.ROUTE SROUTE,
+ D.NOMEN_NAME SNOMEN_NAME,
+ (T.QUANT_REST - T.START_FACT) NDEFRESLIZ,
+ T.REL_FACT NREL_FACT,
+ (T.MAIN_QUANT - T.REL_FACT) NDEFSTART,
+ T.MAIN_QUANT NMAIN_QUANT,
+ (select IDD.CODE from INS_DEPARTMENT IDD where IDD.RN = T.SUBDIV_DLVR) SSUBDIV_DLVR,
(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,
+ and L.IN_UNITCODE = ''CostProductPlansSpecs''
+ and (L.OUT_UNITCODE = ''CostRouteLists'' or L.OUT_UNITCODE = ''IncomFromDeps'')
+ and ROWNUM = 1)) NHAVE_LINK,
+ T.UP_LEVEL NUP_LEVEL
+ from FCPRODPLAN P,
+ FINSTATE FS,
+ FCPRODPLANSP T,
FCMATRESOURCE FM,
DICNOMNS D
- where T.PRN = NFCPRODPLAN
+ 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.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);
+ where ((:NLEVEL is null) or ((:NLEVEL is not null) and (level <= :NLEVEL)))
+ connect by prior TMP.NRN = TMP.NUP_LEVEL
+ start with TMP.NUP_LEVEL is null
+ order siblings by TMP.%SORT_FIELD% asc';
+ /* Подставляем поле сортировки */
+ CSQL := replace(CSQL, '%SORT_FIELD%', SSORT_FIELD);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCRN', NVALUE => NCRN);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR,
+ SNAME => 'NFCPRODPLAN_CATEGORY',
+ NVALUE => NFCPRODPLAN_CATEGORY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLAN_STATUS', NVALUE => NFCPRODPLAN_STATUS);
+ PKG_SQL_DML.BIND_VARIABLE_STR(ICURSOR => ICURSOR, SNAME => 'SFCPRODPLAN_TYPE', SVALUE => SFCPRODPLAN_TYPE);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NLEVEL', NVALUE => NLEVEL);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 8);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 12);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 13);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 14);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 15);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 16);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
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))))
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
loop
- /* Добавляем зависимости */
- PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_DEPENDENCY(RTASK => RGT, NDEPENDENCY => LINK.RN);
+ /* Читаем данные из курсора */
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NTASK_RN);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 2, NVALUE => NTASK_PRN);
+ PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 3, SVALUE => STASK_PROD_ORDER);
+ PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 4, DVALUE => DTASK_REP_DATE);
+ PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 5, DVALUE => DTASK_REP_DATE_TO);
+ PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => 6, DVALUE => DTASK_INCL_DATE);
+ PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 7, SVALUE => STASK_ROUTE);
+ PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 8, SVALUE => STASK_NOMEN_NAME);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 9, NVALUE => NTASK_DEFRESLIZ);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 10, NVALUE => NTASK_REL_FACT);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 11, NVALUE => NTASK_DEFSTART);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 12, NVALUE => NTASK_MAIN_QUANT);
+ PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 13, SVALUE => STASK_SUBDIV_DLVR);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 14, NVALUE => NTASK_HAVE_LINK);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 15, NVALUE => NTASK_UP_LEVEL);
+ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 16, NVALUE => NTASK_LEVEL);
+ /* Формируем описание задачи в Ганте */
+ STASK_CAPTION := MAKE_INFO(SPROD_ORDER => STASK_PROD_ORDER,
+ SNOMEN_NAME => STASK_NOMEN_NAME,
+ SSUBDIV_DLVR => STASK_SUBDIV_DLVR,
+ NMAIN_QUANT => NTASK_MAIN_QUANT);
+ /* Инициализируем даты и цвет (если необходимо) */
+ FCPRODPLANSP_DATES_GET(DREP_DATE => DTASK_REP_DATE,
+ DREP_DATE_TO => DTASK_REP_DATE_TO,
+ DINCL_DATE => DTASK_INCL_DATE,
+ NHAVE_LINK => COALESCE(NTASK_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 => NTASK_DEFRESLIZ,
+ NREL_FACT => NTASK_REL_FACT,
+ NDEFSTART => NTASK_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 => NTASK_RN,
+ SNUMB => COALESCE(STASK_ROUTE, 'Отсутствует'),
+ SCAPTION => STASK_CAPTION,
+ SNAME => STASK_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);
+ /* Заполним значение динамических атрибутов */
+ FILL_TASK_ATTRS(RG => RG,
+ RGT => RGT,
+ SPROD_ORDER => STASK_PROD_ORDER,
+ SSUBDIV_DLVR => STASK_SUBDIV_DLVR,
+ NMAIN_QUANT => NTASK_MAIN_QUANT,
+ NDEFRESLIZ => NTASK_DEFRESLIZ,
+ NREL_FACT => NTASK_REL_FACT,
+ NDEFSTART => NTASK_DEFSTART,
+ NLEVEL => NTASK_LEVEL);
+ /* Собираем зависимости */
+ for LINK in (select T.RN
+ from FCPRODPLANSP T
+ where T.PRN = NTASK_PRN
+ and T.UP_LEVEL = NTASK_RN
+ and ((NLEVEL is null) or ((NLEVEL is not null) and (NLEVEL >= NTASK_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;
- /* Добавляем основную спецификацию в диаграмму */
- PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK(RGANTT => RG, RTASK => RGT);
- end loop;
+ /* Освобождаем курсор */
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
/* Формируем список */
COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG);
end FCPRODPLANSP_GET;
-
- /* Инициализация планов и отчетов производства изделий */
- procedure PRODPLAN_INIT
+
+ /* Инициализация каталогов раздела "Планы и отчеты производства изделий" */
+ procedure ACATALOG_INIT
(
- COUT out clob -- Список планов и отчетов производства изделий
+ COUT out clob -- Список каталогов раздела "Планы и отчеты производства изделий"
)
is
begin
@@ -356,54 +556,27 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Открываем корень */
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)
+ for REC in (select T.RN as NRN,
+ T.NAME as SNAME
+ from ACATALOG T,
+ UNITLIST UL
+ where T.DOCNAME = 'CostProductPlans'
+ and T.SIGNS = 1
+ and T.DOCNAME = UL.UNITCODE
+ and (UL.SHOW_INACCESS_CTLG = 1 or exists
+ (select null from V_USERPRIV UP where UP.CATALOG = T.RN) or exists
+ (select null
+ from ACATALOG T1
+ where exists (select null from V_USERPRIV UP where UP.CATALOG = T1.RN)
+ connect by prior T1.RN = T1.CRN
+ start with T1.CRN = T.RN))
+ order by T.NAME asc)
loop
/* Открываем план */
- PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLANS');
+ PKG_XFAST.DOWN_NODE(SNAME => 'XFCPRODPLAN_CRNS');
/* Описываем план */
PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN);
- PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => REC.SDOC_INFO);
+ PKG_XFAST.ATTR(SNAME => 'SNAME', SVALUE => REC.SNAME);
/* Закрываем план */
PKG_XFAST.UP();
end loop;
@@ -420,7 +593,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
- end PRODPLAN_INIT;
-
+ end ACATALOG_INIT;
+
end PKG_P8PANELS_MECHREC;
/