Exemple #1
0
        public void NewGroup(GanttItem task)
        {
            clTask newStGroup; // Структура новой группы

            dictTasks.TryGetValue(task.Key, out newStGroup);
            if (newStGroup == null)
                newStGroup = new clTask();
            int index = mainList.IndexOf(newStGroup);

            newStGroup.bGroup = true;
            newStGroup.TaskName = task.Text;
            newStGroup.keyGantt = task.Key;
            newStGroup.externalTask = false;
            newStGroup.Dates.RuleForStartDate = Service.GetNamedValue(@"WORKORG\WayToCalculateDates\ManualWayToCalculateDates");
            // InternalCalculation1 - Вычислять начало
            newStGroup.Dates.DataBegTask = DateTime.MinValue;
            newStGroup.Dates.RuleForFinishDate = Service.GetNamedValue(@"WORKORG\WayToCalculateDates\ManualWayToCalculateDates");
            newStGroup.Dates.DataEndTask = DateTime.MinValue;
            // Календарь переприсваивать не надо - пусть остаётся тот же, который был при импорте
            // Признак Вехи переприсваивать не надо - пусть остаётся тот же, который был при импорте

            if (index == -1)
            // Новая группа
            {
                // Новая запись в словаре
                dictTasks.Add(newStGroup.keyGantt, newStGroup);
                // Новая запись в списке
                mainList.Add(newStGroup);
                index = mainList.IndexOf(newStGroup);
            }

            if (((GroupItem)task).ChildItems.Count() == 0)
            {
                // Создание новой задачи
                TaskItem gt = this.GanttDiag.AddTask(DateTime.Now, DateTime.Now.AddDays(1), "Новая задача", GetNextOrder());
                ((GroupItem)task).AddChild(gt);
                NewTask(gt);
            }

            foreach (var ts in ((GroupItem)task).ChildItems)
            {
                if (ts.ItemType == GanttItemType.GroupItem)
                    NewGroup(ts);
                else
                {
                    clTask strTask = null;
                    int ind = -1;
                    if (FindStOnKeyGantt(ts.Key, ref strTask, ref ind))
                    {
                        newStGroup.lChildrTask.Add(strTask);
                    }
                    NewTask(ts);
                }
            }

            if (task.ParentItem == null) // Нет родительской группы            
            {
                // Назначение основной группы - родительской для newStGroup
                this.GanttDiag.Groups[0].AddChild(task);
            }
            else
            {
                // Запись в список родительских задач в структуре newStGroup
                HelperClasses.stParentTask stPT = new HelperClasses.stParentTask(); // Структура родительской группы
                clTask rabStTask = new clTask(); // Структура данных родительской группы
                if (dictTasks.TryGetValue(task.ParentItem.Key, out rabStTask))
                {
                    // Данные родительской группы rabStTask для группы newStTask определены
                    var ind = mainList.IndexOf(rabStTask);
                    // Поиск и удаление данных в дочерних задачах задачи newStTask
                    FindDelChlidSt(newStGroup.keyGantt);
                    stPT.Obj = rabStTask.Obj; // ИО родителской группы
                    stPT.IsPrimary = true; // Признак основной родительской задачи
                    stPT.keyGantt = rabStTask.keyGantt;
                    stPT.TaskName = rabStTask.TaskName;
                    stPT.idPlm = rabStTask.idPlm;
                    newStGroup.lParentTask.Add(stPT);
                    // Дополнение новой задачи в список дочерних
                    rabStTask.lChildrTask.Add(rabStTask);
                    // Замена в словаре
                    dictTasks[task.ParentItem.Key] = rabStTask;
                    // Замена в списке
                    mainList[ind] = rabStTask;
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Функция обновляет данные задачи в хранилище  mainList 
        /// </summary>
        /// <param name="task">объект диаграммы</param>
        public void NewTask(GanttItem task)
        {
            clTask newStTask;
            dictTasks.TryGetValue(task.Key, out newStTask);
            if (newStTask == null)
                newStTask = new clTask();

            int index = mainList.IndexOf(newStTask);

            newStTask.bGroup = false;
            newStTask.TaskName = task.Text;
            newStTask.keyGantt = task.Key;
            newStTask.externalTask = false;
            newStTask.Dates.RuleForStartDate = Service.GetNamedValue(@"WORKORG\WayToCalculateDates\ManualWayToCalculateDates");
            // InternalCalculation1 - Вычислять начало
            newStTask.Dates.DataBegTask = DateTime.MinValue;
            newStTask.Dates.RuleForFinishDate = Service.GetNamedValue(@"WORKORG\WayToCalculateDates\ManualWayToCalculateDates");
            newStTask.Dates.DataEndTask = DateTime.MinValue;
            newStTask.nOrder = GetNextOrder();
            // Календарь
            if ((task as TaskItem).Calendar == null) newStTask.Dates.calendar = null;
            else newStTask.Dates.calendar = this.CalendarsWorker.GetPLMCalendarByCalendarKey((task as TaskItem).Calendar.Key);

            newStTask.SetMilestone((task as TaskItem).IsMilestone); // Признак Вехи
            // Ограничения            
            newStTask.Constraints.StartDateNoEarlierThan = CheckDate((task as TaskItem).EarliestStartDate);
            newStTask.Constraints.StartDateNoLaterThan = CheckDate((task as TaskItem).LatestStartDate);
            newStTask.Constraints.FinishDateNotEarlierThan = CheckDate((task as TaskItem).EarliestEndDate);
            newStTask.Constraints.FinishDateNoLaterThan = CheckDate((task as TaskItem).LatestEndDate);

            // Процент завершения
            newStTask.Dates.Percentage = (int)((KS.Gantt.TaskItem)task).PercentDonePercent;
            if (task.ParentItem == null)
            {
                // Назначение основной группы - родительской для newStTask
                if (this.GanttDiag.Groups.Count > 0)
                    this.GanttDiag.Groups[0].AddChild(task);
            }
            else
            {
                // Запись в список родительских задач в структуре newStTask
                HelperClasses.stParentTask stPT = new HelperClasses.stParentTask(); // Структура родительской группы
                clTask parentStTask = new clTask(); // Данные родительской задачи
                if (dictTasks.TryGetValue(task.ParentItem.Key, out parentStTask) == true)
                // Родительская задача существует
                {
                    HelperClasses.stParentTask stParent = newStTask.lParentTask.Find(
                        delegate(HelperClasses.stParentTask bk)
                        {
                            return bk.keyGantt == parentStTask.keyGantt;
                        }
                    );

                    if (stParent.TaskName == null)
                    {
                        // Индекс записи данных родительской задачи в списке mainList
                        var ind = mainList.IndexOf(parentStTask);
                        stPT.IsPrimary = true; // Признак основной родительской задачи
                        stPT.Obj = parentStTask.Obj; // ИО родителской группы
                        stPT.keyGantt = parentStTask.keyGantt;
                        stPT.TaskName = parentStTask.TaskName;
                        stPT.idPlm = parentStTask.idPlm;
                        newStTask.lParentTask.Add(stPT);
                        // Поиск и удаление данных во всех дочерних задачах задачи newStTask
                        FindDelChlidSt(newStTask.keyGantt);
                        // Дополнение новой задачи в список дочерних для родительской
                        parentStTask.lChildrTask.Add(newStTask);
                        // Замена в словаре
                        dictTasks[task.ParentItem.Key] = parentStTask;
                        // Замена в списке (обновление данных родительской задачи)
                        mainList[ind] = parentStTask;
                    }
                }
            }

            // Ресурсы
            ResourceWorker.TransferResources(task, ref newStTask);

            // Временные зависимости
            clTask depStTask;
            newStTask.Dates.lDependentTask.Clear();
            foreach (var dp in ((TaskItem)task).Dependencies)
            {
                // Переносим только жёсткие зависимости
                if (dp.TaskRelationMode == TaskRelationModes.Soft) continue;

                stDependents stDep = new stDependents();
                if (dictTasks.TryGetValue(dp.TaskKey, out depStTask))
                {
                    stDep.Obj = depStTask.Obj;
                    stDep.idPlm = depStTask.Obj.Id;
                    stDep.TaskName = dp.Task.Text;
                    stDep.typeGantt = dp.TaskRelationType;
                    // Задание значения Тип временной зависимости для PLM
                    if (stDep.typeGantt == TaskRelationTypes.EndStart)
                        // Следует после (Окончание-начало)
                        stDep.ProjectTaskLinkType =
                            Service.GetNamedValue(@"WORKORG\ProjectTaskLinkType\l1");
                    else if (stDep.typeGantt == TaskRelationTypes.StartStart)
                        // Начать вместе с (Начало-начало)
                        stDep.ProjectTaskLinkType =
                            Service.GetNamedValue(@"WORKORG\ProjectTaskLinkType\l2");
                    else if (stDep.typeGantt == TaskRelationTypes.EndEnd)
                        // Завершить вместе с (Окончание-окончание)
                        stDep.ProjectTaskLinkType =
                            Service.GetNamedValue(@"WORKORG\ProjectTaskLinkType\l3");
                    else
                        // Завершить до (Начало-окончание)
                        stDep.ProjectTaskLinkType = Service.GetNamedValue(@"WORKORG\ProjectTaskLinkType\l4");
                    // Запаздывание (календарное)
                    stDep.Delay = dp.DelayDays;
                    // Ед.изм (дни/часы) - было depStTask.Dates.TypeOfDuration
                    stDep.DelayType = (dp.DelayDurationType == TaskItem.DurationTypes.FullWorkingDays ?
                        Service.GetNamedValue(@"WORKORG\TypeOfDuration\Days") : Service.GetNamedValue(@"WORKORG\TypeOfDuration\Hours"));
                    stDep.IsStrict = (task as TaskItem).ASAP ? 1 : 0;

                    // Использовать календарь от
                    stDep.UseTaskCalendar = true;

                    newStTask.Dates.lDependentTask.Add(stDep);
                }
            }
            if (newStTask.Obj == null)
            {
                // Новая задача
                if (dictTasks.ContainsKey(newStTask.keyGantt) == false)
                {
                    dictTasks.Add(newStTask.keyGantt, newStTask);
                    mainList.Add(newStTask);
                }
            }
            else
            {
                // Старая задача
                mainList[index] = newStTask;
                dictTasks[newStTask.keyGantt] = newStTask;
            }

        }
Exemple #3
0
        /// <summary>
        /// Чтение данных из объекта ПЛМ. 
        /// Создание списка всех задач, входящих в выбранный объект, включаяя задачи, находящиеся вне объекта.
        /// Объекты могут содержать дерево задач (Задача, Группа задач, Проект) - в этом случае DoOperChildren = true,
        /// а могут содержать плоский список задач (Ресурсы, Задачи сотрудника) - в этом случае DoOperChildren = false.
        /// </summary>
        /// <param name="obj">Объект, который будет считан</param>
        /// <param name="DoReadChildren">Признак - формировать объекты Гантта изи входящих задач или нет</param>
        /// <returns> List<stTask> - расширенных список задач </returns>
        private clTask AddTasks2List(InfoObject obj, bool DoOperChildren, clTask ParentTask)
        {
            clTask strTask = new clTask();// Структура дочерней задачи
            strTask.ParentTask = ParentTask;
            strTask.externalTask = false;
            strTask.Dates.bData = false;
            strTask.FillclTask(obj);

            strTask.Dates.lDependentTask = CreateDepedent(strTask.Obj);

            // Список родительских задач(ParentTasks) для задачи obj из таблицы "Входит в:"
            var ParentTasks = obj.GetAttribute("ParentList", AttributeDefBase.DataTypeEnum.CollectionOfElements);
            if (ParentTasks != null)
            {
                // Создание списка родительских задач в структуре strTask
                foreach (var task in ParentTasks.CollectionElements)
                {
                    // Запись в список родительских задач в структуре strTask
                    HelperClasses.stParentTask stPT = new HelperClasses.stParentTask();
                    stPT.Obj = task.GetValue<InfoObject>("ProjectTask");
                    stPT.IsPrimary = task.GetValue<bool>("IsPrimary");
                    // Наименование задачи
                    stPT.TaskName = stPT.Obj["TaskName"].ToString();
                    // Идентификатор объекта из PLM
                    stPT.idPlm = stPT.Obj.Id;
                    strTask.lParentTask.Add(stPT);
                }
            }

            ResourceWorker.AddResource(obj, ref strTask);

            mainList.Add(strTask);

            if (DoOperChildren)
            {
                // Если установлен ShowTopLevel, то из ПЛМ считается только один уровень задач
                DoOperChildren = !this.ShowTopLevel;

                // Список дочерних задач для задачи obj - listChildr из таблицы "Состоит из:"
                var listChildr = obj.GetAttribute("SubTaskList").CollectionElements.ToList();
                strTask.bGroup = (listChildr.Count() != 0);

                // Сортировка дочерних задач по Order
                listChildr = listChildr.OrderBy(pet => pet.GetValue<int>("Order")).ToList();
                // Создание списка дочерних задач в структуре strTask
                foreach (var lC in listChildr)
                {
                    // Дочерняя задача для задачи obj
                    InfoObject childObj = lC.GetValue<InfoObject>("ProjectTask");
                    strTask.lChildrTask.Add(AddTasks2List(childObj, DoOperChildren, strTask));
                }
            }
            else
                strTask.bGroup = false;

            return strTask;

        }