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 ? ( - - Уровень - { + handleChangeSelectSort(event.target.value); + }} + defaultValue={state.selectedPlanCtlgLevel} + > + + Дата выпуска - ))} - + + Дата запуска + + + + + До уровня + + - ) : 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; /