/* Поле "deviationPlan" с отклонением от БП. Содержит разницу (отклонение) в РАБОЧИХ днях между соответствующими плановой или фактической датой окончания (ПДО или ФДО соответственно) и утвержденной датой окончания (УДО) по последней версии БП. Логика расчета для каждого соответствующего объекта: - Если у объекта есть УДО и ФДО, то отклонение = ФДО – УДО. - Если у объекта есть УДО, но нет ФДО, то отклонение = ПДО – УДО. - Если у объекта нет УДО, то расчет не производится. В соответствующей ячейке поля содержится пустое значение (не 0, а именно пустое значение). - Положительные значения говорят о просрочке, отрицательные – об опережении утвержденного срока в БП. Поле "deviationStatus" с числовым значением индикатора отклонения от БП. Логика расчета для каждого соответствующего объекта: - Если значение поля "deviationPlan" в диапазоне (-∞; 7], то в поле записывается значение = 1. - Если значение поля "deviationPlan" в диапазоне (7; 14], то в поле записывается значение = 2. - Если значение поля "deviationPlan" в диапазоне (14; +∞], то в поле записывается значение = 3. - Если значение поля "deviationPlan" пустое, то в поле "deviationStatus" ничего не записывается (остается пустое значение). */ var objectID = parameters.GetValueOrDefault<Guid>("RootProjectId", new Guid("9443d7de-f036-4367-b51b-5c47d8f85a01")); // ID объекта из Ганта var deviation = dataContext.Projects .Where(p => p.BaselinePlanEndDate != null && p.GetParentHierarchy<Project>(true).Any(a => a.Id == objectID) ) .OrderBy(p => p.Name) .Select(a => new {a.Id, a.Name, a.SystemEndDate, a.BaselinePlanEndDate, a.ActualEndDate, a.CalendarId }) .ToList() .Select(b => new {b.Id, b.Name, b.SystemEndDate, b.BaselinePlanEndDate, b.ActualEndDate, deviationPlan = Math.Round(b.ActualEndDate != null ? workCalendars.GetWorkCalendar(b.CalendarId).GetWorktimeDays(b.BaselinePlanEndDate.Value.Date, b.ActualEndDate.Value.Date) : workCalendars.GetWorkCalendar(b.CalendarId).GetWorktimeDays(b.BaselinePlanEndDate.Value.Date, b.SystemEndDate.Value.Date)) } ) .ToList() .Select(c => new {c.Id, c.Name, c.SystemEndDate, c.BaselinePlanEndDate, c.ActualEndDate, c.deviationPlan, deviationStatus1 = c.deviationPlan <= 7 ? 1 : 0, deviationStatus2 = c.deviationPlan > 7 && c.deviationPlan <= 14 ? 2 : 0, deviationStatus3 = c.deviationPlan > 14 ? 3 : 0}) .ToList() .Select(d => new {ObjectId = d.Id, d.Name, d.SystemEndDate, d.BaselinePlanEndDate, d.ActualEndDate, deviationPlan = d.deviationPlan, deviationStatus = d.deviationStatus1 + d.deviationStatus2 + d.deviationStatus3}) .ToList(); return deviation;
На странице «Настройка диаграммы Ганта» должны быть отображены два поля «Отклонение от БП» и «Статус отклонения», которые теперь можно отобразить в диаграмме Ганта.