Exemplo n.º 1
0
        protected override List <CustomCell> GetListViewSubItems(AircraftFlight item)
        {
            //TODO (Evgenii Babak) : Вся логика должна быть в классе Calculator
            var subItems = new List <CustomCell>();

            var dateString = item.FlightDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString());
            var date       = item.FlightDate.Date.AddMinutes(item.OutTime);
            var atlb       = _atbs.GetItemById(item.ATLBId);
            var author     = GlobalObjects.CasEnvironment.GetCorrector(item);

            if (item.AtlbRecordType == AtlbRecordType.Flight)
            {
                var   route            = item.StationFromId.ShortName + " - " + item.StationToId.ShortName;
                var   flightTimeString = UsefulMethods.TimeToString(new TimeSpan(0, 0, item.FlightTimeTotalMinutes, 0));
                Color flightTimeColor;
                if (item.FlightTime.TotalMinutes == item.BlockTime.TotalMinutes)
                {
                    flightTimeColor = Color.Black;
                }
                else
                {
                    double persent = Math.Abs(1 - (item.FlightTime.TotalMinutes / item.BlockTime.TotalMinutes)) * 100;
                    if (persent <= 3)
                    {
                        flightTimeColor = Color.FromArgb(Highlight.Green.Color);
                    }
                    else if (persent <= 10)
                    {
                        flightTimeColor = Color.FromArgb(Highlight.Yellow.Color);
                    }
                    else
                    {
                        flightTimeColor = Color.FromArgb(Highlight.Red.Color);
                    }
                }

                var perDaysFlight = Lifelength.Zero;
                var perDaysBlock  = Lifelength.Zero;
                var flights       = _flights.Where(f =>
                                                   f.AtlbRecordType != AtlbRecordType.Maintenance && f.FlightDate.Date.AddMinutes(f.TakeOffTime) <=
                                                   item.FlightDate.Date.AddMinutes(item.TakeOffTime)).ToList();
                foreach (AircraftFlight aircraftFlight in flights)
                {
                    perDaysFlight.Add(aircraftFlight.FlightTimeLifelength);
                    perDaysBlock.Add(aircraftFlight.BlockTimeLifelenght);
                }


                subItems.Add(CreateRow(item.PageNo, item.PageNo));
                subItems.Add(CreateRow(dateString, date));
                subItems.Add(CreateRow(item.FlightNumber.ToString(), item.FlightNumber));
                subItems.Add(CreateRow(route, route));
                subItems.Add(CreateRow(flightTimeString, item.FlightTime, flightTimeColor));

                #region колонки для отображения наработок по двигателям и ВСУ

                foreach (BaseComponent baseComponent in _enginesAndAPU.Where(i =>
                                                                             i.BaseComponentType == BaseComponentType.Engine))
                {
                    bool shouldFillSubItems = false;

                    var baseComponentFlightLifeLenght = Lifelength.Null;

                    var lastKnownTransferRecBeforFlight =
                        baseComponent.TransferRecords.GetLastKnownRecord(item.FlightDate.Date);
                    if (lastKnownTransferRecBeforFlight != null &&
                        lastKnownTransferRecBeforFlight.DestinationObjectType == SmartCoreType.Aircraft &&
                        lastKnownTransferRecBeforFlight.DestinationObjectId == _parentAircraft.ItemId)
                    {
                        shouldFillSubItems = true;
                        var flightsWhichOccuredAfterInstallationOfBd = flights.Where(f =>
                                                                                     f.AtlbRecordType != AtlbRecordType.Maintenance &&
                                                                                     f.FlightDate.Date >= lastKnownTransferRecBeforFlight.RecordDate).ToList();

                        var perDaysFlightForBd = Lifelength.Zero;
                        var perDaysBlockForBd  = Lifelength.Zero;

                        foreach (var flight in flightsWhichOccuredAfterInstallationOfBd)
                        {
                            perDaysFlightForBd.Add(flight.FlightTimeLifelength);
                            perDaysBlockForBd.Add(flight.BlockTimeLifelenght);
                        }

                        baseComponentFlightLifeLenght =
                            GlobalObjects.CasEnvironment.Calculator.GetFlightLifelengthIncludingThisFlight(
                                baseComponent, item);
                    }

                    Color baseComponentTimeColor = Color.Black;
                    if (baseComponent.BaseComponentType == BaseComponentType.Engine)
                    {
                        if (!last.ContainsKey(baseComponent.ItemId))
                        {
                            last.Add(baseComponent.ItemId, new List <AircraftFlight>());
                        }

                        if (shouldFillSubItems)
                        {
                            subItems.Add(CreateListViewSubItem(baseComponentTimeColor, baseComponentFlightLifeLenght));
                            var cp = WorkParams.FirstOrDefault(i =>
                                                               i.ComponentId == baseComponent.ItemId && i.GroundAir == GroundAir.Air);
                            var cc = OilConditions.FirstOrDefault(i =>
                                                                  i.ComponentId == baseComponent.ItemId && i.FlightId == item.ItemId);

                            var oilFlowMin  = cp?.OilFlowMin ?? 0;
                            var oilFlowNorm = cp?.OilFlowRecomended ?? 0;
                            var oilFlowMax  = cp?.OilFlowMax ?? 0;
                            var oilAdded    = cc?.OilAdded ?? 0;



                            var q = _flights
                                    .Where(f => f.AtlbRecordType != AtlbRecordType.Maintenance &&
                                           f.FlightDate.Date.AddMinutes(f.TakeOffTime) <=
                                           item.FlightDate.Date.AddMinutes(item.TakeOffTime))
                                    .OrderByDescending(i => i.FlightDate).ThenByDescending(i => i.TakeOffTime)
                                    .ToList();


                            var    spent           = cc?.Spent ?? 0;
                            double consumption     = 0;
                            double consumptionMean = 0;


                            if (oilAdded > 0)
                            {
                                if (last[baseComponent.ItemId].Any())
                                {
                                    if (last[baseComponent.ItemId].Last().ItemId != item.ItemId)
                                    {
                                        var  temp = new List <AircraftFlight>();
                                        bool flag = false;
                                        foreach (var aircraftFlight in q)
                                        {
                                            if (aircraftFlight.ItemId == last[baseComponent.ItemId].Last().ItemId)
                                            {
                                                flag = true;
                                            }
                                            if (flag)
                                            {
                                                temp.Add(aircraftFlight);
                                            }
                                        }

                                        foreach (var aircraftFlight in temp)
                                        {
                                            q.Remove(aircraftFlight);
                                        }
                                    }
                                }

                                var sumTime = q.Sum(i => i.FlightTime.TotalMinutes);
                                spent       = oilAdded / sumTime;
                                consumption = spent * 60.0;

                                if (!last[baseComponent.ItemId].Any(i => i.ItemId == item.ItemId))
                                {
                                    last[baseComponent.ItemId].Add(item);
                                }
                            }


                            if (!_consumptionMeans.ContainsKey(baseComponent.ItemId))
                            {
                                _consumptionMeans.Add(baseComponent.ItemId, new List <dynamic>());
                            }

                            _consumptionMeans[baseComponent.ItemId].Add(new { UpLift = cc?.OilAdded * 60 ?? 0, FlightTime = item.FlightTime.TotalMinutes });
                            consumptionMean = _consumptionMeans[baseComponent.ItemId].Sum(i => (double)i.UpLift) /
                                              _consumptionMeans[baseComponent.ItemId].Sum(i => (double)i.FlightTime);

                            subItems.Add(CreateListViewSubItem(oilAdded.ToString()));
                            subItems.Add(CreateListViewSubItem(oilFlowMin.ToString()));
                            subItems.Add(CreateListViewSubItem(oilFlowNorm.ToString()));
                            subItems.Add(CreateListViewSubItem(oilFlowMax.ToString()));
                            subItems.Add(CreateListViewSubItem(consumption.ToString("F")));
                            subItems.Add(CreateListViewSubItem(consumptionMean.ToString("F")));
                            subItems.Add(CreateListViewSubItem(GetStatus(oilFlowMin, oilFlowNorm, oilFlowMax, consumption)
                                                               .ToString()));


                            if (item.AtlbRecordType == AtlbRecordType.Flight && oilAdded > 0)
                            {
                                if (!_graph.Limits.ContainsKey(baseComponent))
                                {
                                    _graph.Limits.Add(baseComponent, new OilLimits()
                                    {
                                        Max    = oilFlowMax,
                                        Min    = oilFlowMin,
                                        Normal = oilFlowNorm
                                    });
                                }

                                if (!_graph.Graph.ContainsKey(baseComponent))
                                {
                                    _graph.Graph.Add(baseComponent, new Dictionary <Lifelength, dynamic>());
                                }


                                if (!_graph.Graph[baseComponent].ContainsKey(baseComponentFlightLifeLenght))
                                {
                                    _graph.Graph[baseComponent].Add(baseComponentFlightLifeLenght, new { Consumption = consumption, ConsumptionMean = consumptionMean });
                                }
                                //else throw new Exception("Такая наработка уже есть!");
                            }
                        }
                        else
                        {
                            subItems.Add(CreateListViewSubItem(string.Empty));
                            subItems.Add(CreateListViewSubItem(string.Empty));
                            subItems.Add(CreateListViewSubItem(string.Empty));
                            subItems.Add(CreateListViewSubItem(string.Empty));
                            subItems.Add(CreateListViewSubItem(string.Empty));
                            subItems.Add(CreateListViewSubItem(string.Empty));
                            subItems.Add(CreateListViewSubItem(string.Empty));
                        }
                    }
                }

                #endregion

                subItems.Add(CreateRow(atlb?.ATLBNo ?? "AtlB deleted", atlb?.ATLBNo));
                subItems.Add(CreateRow(author, author));
            }
            else
            {
                subItems.Add(CreateRow(item.PageNo, item.PageNo));
                subItems.Add(CreateRow(dateString, date));
                subItems.Add(CreateRow(item.FlightNumber.ToString(), item.FlightNumber));
                subItems.Add(CreateRow(item.StationToId.ShortName, item.StationToId.ShortName));
                subItems.Add(CreateRow("", ""));

                #region колонки для отображения наработок по двигателям и ВСУ

                foreach (var baseComponent in _enginesAndAPU)
                {
                    if (baseComponent.BaseComponentType == BaseComponentType.Engine)
                    {
                        subItems.Add(CreateRow("", ""));
                        subItems.Add(CreateRow("", ""));
                        subItems.Add(CreateRow("", ""));
                        subItems.Add(CreateRow("", ""));
                        subItems.Add(CreateRow("", ""));
                        subItems.Add(CreateRow("", ""));
                        subItems.Add(CreateRow("", ""));
                        subItems.Add(CreateRow("", ""));
                    }
                }

                #endregion

                subItems.Add(CreateRow(atlb?.ATLBNo, atlb?.ATLBNo));
                subItems.Add(CreateRow(author, author));
            }


            return(subItems);
        }