private void DrawRefreshed(ComplaintFilterViewModel filter, int totalCount, int overduedCount, ILevelConfig[] levels, IList <object[]> complaintResults) { lblCaption.Markup = string.Format("<u><b>Сводка по рекламациям\nСписок виновных:</b></u>"); lblUnclosedCount.Markup = string.Format( "<b>Не закрыто <span foreground='{2}'>{0}</span> рекламаций,\nиз них просрочено <span foreground='{2}'>{1}</span> шт.</b>", totalCount, overduedCount, totalCount >= 0 ? "red" : "black" ); yTreeView.YTreeModel = new LevelTreeModel <ComplaintGuiltyNode>(guilties, levels); yTVComplainsResults.SetItemsSource(complaintResults); }
private IList <ComplaintGuiltyNode> GetGuilties(ComplaintFilterViewModel filter) { Complaint complaintAlias = null; Subdivision subdivisionAlias = null; Subdivision subdivisionForEmployeeAlias = null; Employee employeeAlias = null; ComplaintGuiltyItem guiltyItemAlias = null; ComplaintResultOfCounterparty resultOfCounterpartyAlias = null; ComplaintResultOfEmployees resultOfEmployeesAlias = null; QueryNode queryNodeAlias = null; ComplaintDiscussion discussionAlias = null; var query = InfoProvider.UoW.Session.QueryOver(() => guiltyItemAlias) .Left.JoinAlias(() => guiltyItemAlias.Complaint, () => complaintAlias) .Left.JoinAlias(() => complaintAlias.ComplaintResultOfCounterparty, () => resultOfCounterpartyAlias) .Left.JoinAlias(() => complaintAlias.ComplaintResultOfEmployees, () => resultOfEmployeesAlias) .Left.JoinAlias(() => guiltyItemAlias.Subdivision, () => subdivisionAlias) .Left.JoinAlias(() => guiltyItemAlias.Employee, () => employeeAlias) .Left.JoinAlias(() => employeeAlias.Subdivision, () => subdivisionForEmployeeAlias); filter.EndDate = filter.EndDate.Date.AddHours(23).AddMinutes(59); if (filter.StartDate.HasValue) { filter.StartDate = filter.StartDate.Value.Date; } QueryOver <ComplaintDiscussion, ComplaintDiscussion> dicussionQuery = null; if (filter.Subdivision != null) { dicussionQuery = QueryOver.Of(() => discussionAlias) .Select(Projections.Property <ComplaintDiscussion>(p => p.Id)) .Where(() => discussionAlias.Subdivision.Id == filter.Subdivision.Id) .And(() => discussionAlias.Complaint.Id == complaintAlias.Id); } if (filter.StartDate.HasValue) { switch (filter.FilterDateType) { case DateFilterType.PlannedCompletionDate: if (dicussionQuery == null) { query = query.Where(() => complaintAlias.PlannedCompletionDate <= filter.EndDate) .And(() => filter.StartDate == null || complaintAlias.PlannedCompletionDate >= filter.StartDate.Value); } else { dicussionQuery = dicussionQuery .And(() => filter.StartDate == null || discussionAlias.PlannedCompletionDate >= filter.StartDate.Value) .And(() => discussionAlias.PlannedCompletionDate <= filter.EndDate); } break; case DateFilterType.ActualCompletionDate: query = query.Where(() => complaintAlias.ActualCompletionDate <= filter.EndDate) .And(() => filter.StartDate == null || complaintAlias.ActualCompletionDate >= filter.StartDate.Value); break; case DateFilterType.CreationDate: query = query.Where(() => complaintAlias.CreationDate <= filter.EndDate) .And(() => filter.StartDate == null || complaintAlias.CreationDate >= filter.StartDate.Value); break; default: throw new ArgumentOutOfRangeException(); } } if (dicussionQuery != null) { query.WithSubquery.WhereExists(dicussionQuery); } if (filter.ComplaintType != null) { query = query.Where(() => complaintAlias.ComplaintType == filter.ComplaintType); } if (filter.ComplaintStatus != null) { query = query.Where(() => complaintAlias.Status == filter.ComplaintStatus); } if (filter.Employee != null) { query = query.Where(() => complaintAlias.CreatedBy.Id == filter.Employee.Id); } if (filter.GuiltyItemVM?.Entity?.GuiltyType != null) { var subquery = QueryOver.Of <ComplaintGuiltyItem>() .Where(g => g.GuiltyType == filter.GuiltyItemVM.Entity.GuiltyType.Value); switch (filter.GuiltyItemVM.Entity.GuiltyType) { case ComplaintGuiltyTypes.None: case ComplaintGuiltyTypes.Client: case ComplaintGuiltyTypes.Depreciation: case ComplaintGuiltyTypes.Supplier: break; case ComplaintGuiltyTypes.Employee: if (filter.GuiltyItemVM.Entity.Employee != null) { subquery.Where(g => g.Employee.Id == filter.GuiltyItemVM.Entity.Employee.Id); } break; case ComplaintGuiltyTypes.Subdivision: if (filter.GuiltyItemVM.Entity.Subdivision != null) { subquery.Where(g => g.Subdivision.Id == filter.GuiltyItemVM.Entity.Subdivision.Id); } break; default: break; } query.WithSubquery.WhereProperty(() => complaintAlias.Id).In(subquery.Select(x => x.Complaint)); } if (filter.ComplaintKind != null) { query.Where(() => complaintAlias.ComplaintKind.Id == filter.ComplaintKind.Id); } var result = query.SelectList(list => list .SelectGroup(c => c.Complaint.Id) .Select(() => complaintAlias.Status).WithAlias(() => queryNodeAlias.Status) .Select(() => resultOfCounterpartyAlias.Name).WithAlias(() => queryNodeAlias.ResultOfCounterpartyText) .Select(() => resultOfEmployeesAlias.Name).WithAlias(() => queryNodeAlias.ResultOfEmployeesText) .Select(Projections.SqlFunction( new SQLFunctionTemplate( NHibernateUtil.String, "GROUP_CONCAT(" + "CASE ?1 " + $"WHEN '{nameof(ComplaintGuiltyTypes.Employee)}' THEN IFNULL(CONCAT('Отд: ', ?2), 'Отдел ВВ') " + $"WHEN '{nameof(ComplaintGuiltyTypes.Subdivision)}' THEN IFNULL(CONCAT('Отд: ', ?3), 'Отдел ВВ') " + $"WHEN '{nameof(ComplaintGuiltyTypes.Client)}' THEN 'Клиент' " + $"WHEN '{nameof(ComplaintGuiltyTypes.Depreciation)}' THEN 'Износ' " + $"WHEN '{nameof(ComplaintGuiltyTypes.Supplier)}' THEN 'Поставщик' " + $"WHEN '{nameof(ComplaintGuiltyTypes.None)}' THEN 'Нет (не рекламация)' " + "ELSE ?1 " + "END " + "ORDER BY ?1 ASC SEPARATOR '\n')"), NHibernateUtil.String, Projections.Property(() => guiltyItemAlias.GuiltyType), Projections.Property(() => subdivisionForEmployeeAlias.Name), Projections.Property(() => subdivisionAlias.Name))) .WithAlias(() => queryNodeAlias.GuiltyName)) .TransformUsing(Transformers.AliasToBean <QueryNode>()) .List <QueryNode>(); var groupedResult = result.GroupBy(p => p.GuiltyName, (guiltyName, guiltiesGroup) => new ComplaintGuiltyNode { GuiltyName = guiltyName, Count = guiltiesGroup.Count(), Guilties = guiltiesGroup.ToList() }).ToList(); //Удаление дублирующихся названий отделов for (int i = 0; i < groupedResult.Count; i++) { if (groupedResult[i].GuiltyName.Contains("\n")) { groupedResult[i].GuiltyName = string.Join("\n", groupedResult[i].GuiltyName.Split('\n').Distinct()); } } foreach (var item in groupedResult) { item.CreateComplaintResultNodes(); } return(groupedResult); }