вот нахрен так писать?
От: nikkit  
Дата: 13.08.23 19:15
Оценка: +1
это лишь лист от той партянки, в которой надо разобраться.
сложного ничего. да. но вот как с листа охватить взглядом реально вообще? специально не говорю какой контекст. т.к. тоже в первый раз отчет этот вижу. и даже не знаю работало там изначально или нет
просто мата не хватает. как такое можно поддерживать, не имея доступа к проду. и не зная как должно быть.
вот для кого пишут книжки типа канонической "чистый код"?
я бы на код ревью точно такое развернул нахрен. ну строк 10 кода, которые сможешь сразу прочитать — да. без проблем. но такое заворачивать.. НАХРЕНА???? Убил бы.
так он там блин еще коменты пишет о красоте кода....

var resultCollection = reportData.GroupBy(g => g.CropId).Select(g =>
            {
                var crop = g.First();
                return new PlanExecutionControlReportItem
                {
                    CropId = crop.CropId,
                    CropName = crop.CropName,
                    Technologies = g.GroupBy(t => t.TechnologyId).Select(t =>
                    {
                        var technologyFirst = t.First();
                        var dateRange = t
                            .Where(x => x.FactOperationSquare > 0)
                            .Select(x => x.FactDateEnd.Date)
                            .Distinct()
                            .OrderBy(d => d)
                            .ToArray();

                        if (t.Any(tr => tr.OperationGroupId.HasValue && tr.TreatmentId != Guid.Empty) && t.Key.HasValue)
                        {
                            var planExecutionControlItems = t.Where(x => x.OperationGroupId.HasValue).ToList();
                            var reportItem = new List<PlanExecutionControlReportTreatment>();
                            var excludedItems = new List<PlanExecutionControlItem>();
                            var operationGroupItems = planExecutionControlItems.GroupBy(x => x.OperationGroupId);
                            foreach (var group in operationGroupItems)
                            {
                                var operationTypeIds = operationTypes.Where(p => p.Value.Contains(group.Key.Value)).Select(p => p.Key).ToList();
                                operationTypeIds.Add(Guid.Empty);
                                var rows = group.Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId)).ToArray();
                                if (!rows.Any()) continue;
                                var operationItemRow = CreateReportItem(rows, dateRange, null, true);
                                reportItem.Add(operationItemRow);
                                var technologyOperation = rows.First();
                                var groupByTreatment = group.Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId)).GroupBy(x => x.TreatmentId);
                                foreach (var treatmentItems in groupByTreatment)
                                {
                                    if (!treatmentItems.Any()) continue;
                                    var treatmentRow = CreateReportItem(treatmentItems.ToArray(), dateRange, operationItemRow.Path.ToList(), false, operationItemRow.PlanDateBegin, operationItemRow.PlanDateStop, technologyOperation);
                                    reportItem.Add(treatmentRow);

                                    reportItem.AddRange(treatmentItems
                                        .Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId))
                                        .GroupBy(tr => new { tr.LayerId })
                                        .Select(tr => CreateReportItem(tr.ToArray(), dateRange, treatmentRow.Path.ToList(), false, treatmentRow.PlanDateBegin, treatmentRow.PlanDateStop, technologyOperation))
                                        .ToArray());
                                    
                                }
                                excludedItems.AddRange(group.Where(tr => tr.OperationGroupId == group.Key && !operationTypeIds.Contains(tr.TreatmentId)));
                            }

                            excludedItems.AddRange(t.Where(x => !x.OperationGroupId.HasValue));
                            reportItem.AddRange(excludedItems
                                .GroupBy(tr => new { tr.LayerId })
                                .Select(tr => CreateReportItem(tr.ToArray(), dateRange))
                                .ToArray());

                            return new PlanExecutionControlReportTechnology
                            {
                                TechnologyId = technologyFirst.TechnologyId,
                                TechnologyName = technologyFirst.TechnologyName,
                                Treatments = reportItem.OrderBy(tr => tr.TreatmentName).ToArray(),
                            };
                        }

                        if (t.Any(tr => tr.OperationGroupId.HasValue) && t.Key.HasValue)
                        {
                            var planExecutionControlItems = t.ToList();
                            var reportItem = new List<PlanExecutionControlReportTreatment>();
                            var excludedItems = new List<PlanExecutionControlItem>();
                            var operationGroupItems = planExecutionControlItems.GroupBy(x => x.OperationGroupId);
                            foreach (var group in operationGroupItems)
                            {
                                var operationTypeIds = operationTypes.Where(p => p.Value.Contains(group.Key ?? Guid.Empty)).Select(p => p.Key).ToArray();
                                var rows = group.Where(tr => tr.OperationGroupId == group.Key || operationTypeIds.Contains(tr.TreatmentId)).ToArray();
                                var operationItemRow = CreateReportItem(rows, dateRange, null, true);
                                reportItem.Add(operationItemRow);
                                reportItem.AddRange(rows
                                    .Where(tr => tr.OperationGroupId == group.Key || operationTypeIds.Contains(tr.TreatmentId))
                                    .GroupBy(tr => new { tr.LayerId })
                                    .Select(tr => CreateReportItem(tr.ToArray(), dateRange, operationItemRow.Path.ToList()))
                                    .ToArray());
                                excludedItems.AddRange(group.Where(tr => tr.OperationGroupId == group.Key && !operationTypeIds.Contains(tr.TreatmentId)));

                            }

                            excludedItems.AddRange(t.Where(x => !x.OperationGroupId.HasValue));
                            reportItem.AddRange(excludedItems
                                .GroupBy(tr => new { tr.LayerId })
                                .Select(tr => CreateReportItem(tr.ToArray(), dateRange))
                                .ToArray());
                            return new PlanExecutionControlReportTechnology
                            {
                                TechnologyId = technologyFirst.TechnologyId,
                                TechnologyName = technologyFirst.TechnologyName,
                                Treatments = reportItem.OrderBy(tr => tr.TreatmentName).ToArray(),
                            };
                        }

                        return new PlanExecutionControlReportTechnology
                        {
                            TechnologyId = technologyFirst.TechnologyId,
                            TechnologyName = technologyFirst.TechnologyName,
                            Treatments = t
                                .GroupBy(tr => new { tr.TreatmentId, tr.LayerId })
                                .Select(tr => CreateReportItem(tr.ToArray(), dateRange))
                                .OrderBy(tr => tr.TreatmentName)
                                .ToArray()
                        };
                    }).OrderBy(t => t.TechnologyName).ToArray()
                };
            }).OrderBy(g => g.CropName).ToArray();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.