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; } } }
/// <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; } }
/// <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; }