예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="AutomaatZuusctand"></param>
        /// <param name="StrategikonInstanz"></param>
        /// <param name="InStrategikonAtom"></param>
        /// <param name="MengeObjektGrupeMesungZaitScrankeMin">
        /// Früheste Zait zu der dii Mesung der Objekt Grupe zum ausscliise der Existenz noc zu bearbaitender Objekte begine darf.</param>
        public void Aktualisiire(
            SictAutomatZuusctand AutomaatZuusctand,
            SictMissionStrategikonInstanz StrategikonInstanz,
            SictMissionStrategikonInRaumAtom InStrategikonAtom,
            Int64?MengeObjektGrupeMesungZaitScrankeMin)
        {
            this.MengeObjektGrupeMesungZaitScrankeMin = MengeObjektGrupeMesungZaitScrankeMin;

            var AtomZwisceergeebnis = this;

            if (null == AutomaatZuusctand)
            {
                return;
            }

            if (null == StrategikonInstanz)
            {
                return;
            }

            var ZaitMili = AutomaatZuusctand.NuzerZaitMili;

            var RaumMengeObjektCargoDurcsuuct = StrategikonInstanz.MengeObjektCargoDurcsuuct;

            var OverviewUndTarget = (null == AutomaatZuusctand) ? null : AutomaatZuusctand.OverviewUndTarget;

            var MengeInRaumObjekt = (null == OverviewUndTarget) ? null : OverviewUndTarget.MengeOverViewObjekt;

            Int64?ErfolgTailVorMengeOverviewObjektGrupeMesungZuErscteleZait = null;

            SictOverviewObjektGrupeEnum[] ZuMengeObjektGrupeMesungVolsctändigFeelend = null;
            var   AtomZwisceergeebnisErfolg = false;
            Int64?MesungMengeObjektGrupeZaitScrankeMinPlusBeruhigungszait = null;

            try
            {
                if (null == InStrategikonAtom)
                {
                    AtomZwisceergeebnisErfolg = true;
                    return;
                }

                if (null == MengeInRaumObjekt)
                {
                    return;
                }

                var InStrategikonAtomMengeObjektFilter = InStrategikonAtom.MengeObjektFilter;

                var InStrategikonAtomMengeObjektFilterGrupe =
                    (null == InStrategikonAtomMengeObjektFilter) ? null :
                    Bib3.Glob.ArrayAusListeFeldGeflact(
                        InStrategikonAtomMengeObjektFilter.Select((ObjektFilter) =>
                {
                    var BedingungTypeUndName = ObjektFilter.BedingungTypeUndName;

                    if (null == BedingungTypeUndName)
                    {
                        return(null);
                    }

                    return(BedingungTypeUndName.MengeGrupeZuDurcsuuce);
                })
                        .Where((Kandidaat) => null != Kandidaat))
                    .Distinct()
                    .ToArray();

                var MengeObjektGefiltert = MengeInRaumObjektGefiltert(MengeInRaumObjekt, InStrategikonAtomMengeObjektFilter);

                var MengeObjektGefiltertNocSictbar =
                    (null == MengeObjektGefiltert) ? null :
                    MengeObjektGefiltert.Where((OverViewObjekt) => ZaitMili <= OverViewObjekt.SictungLezteZait).ToArray();

                var BedingungObjektExistentErfült = false;

                SictOverViewObjektZuusctand[] MengeObjektCargoZuDurcsuuce = null;
                SictOverViewObjektZuusctand[] MengeObjektZuZersctööre     = null;
                KeyValuePair <SictOverViewObjektZuusctand, Int64>?ObjektAnzufliigeUndDistanceScranke = null;

                var FilterCargoZuDurcsuuce =
                    new Func <SictOverViewObjektZuusctand, bool>((InRaumObjekt) => SictMissionZuusctand.FilterCargoZuDurcsuuce(InRaumObjekt, RaumMengeObjektCargoDurcsuuct));

                if (!(true == InStrategikonAtom.BedingungObjektExistent) ||
                    !MengeObjektGefiltertNocSictbar.IsNullOrEmpty())
                {
                    BedingungObjektExistentErfült = true;
                }

                var InStrategikonAtomZuObjektDistanzAinzuscteleScrankeMax = InStrategikonAtom.ZuObjektDistanzAinzuscteleScrankeMax;

                if (null != MengeObjektGefiltert)
                {
                    if (true == InStrategikonAtom.ObjektDurcsuuceCargo)
                    {
                        MengeObjektCargoZuDurcsuuce = MengeObjektGefiltert.Where(FilterCargoZuDurcsuuce).ToArray();
                    }

                    if (true == InStrategikonAtom.ObjektZersctööre)
                    {
                        MengeObjektZuZersctööre = MengeObjektGefiltert;
                    }

                    if (InStrategikonAtomZuObjektDistanzAinzuscteleScrankeMax.HasValue)
                    {
                        var MengeObjektGefiltertDistanceNitPasend =
                            MengeObjektGefiltert.Where((InRaumObjekt) => !(InRaumObjekt.SictungLezteDistanceScrankeMaxScpezOverview <= InStrategikonAtomZuObjektDistanzAinzuscteleScrankeMax.Value)).ToArray();

                        if (0 < MengeObjektGefiltertDistanceNitPasend.Length)
                        {
                            ObjektAnzufliigeUndDistanceScranke = new KeyValuePair <SictOverViewObjektZuusctand, Int64>(
                                MengeObjektGefiltertDistanceNitPasend.FirstOrDefault(), InStrategikonAtomZuObjektDistanzAinzuscteleScrankeMax.Value);
                        }
                    }
                }

                var AtomZwisceergeebnisMengeAufgaabeObjektZuBearbaite = new List <SictAufgaabeParam>();

                if (ObjektAnzufliigeUndDistanceScranke.HasValue)
                {
                    if (null != ObjektAnzufliigeUndDistanceScranke.Value.Key)
                    {
                        AtomZwisceergeebnisMengeAufgaabeObjektZuBearbaite.Add(
                            AufgaabeParamAndere.AufgaabeDistanceAinzusctele(
                                ObjektAnzufliigeUndDistanceScranke.Value.Key, null, ObjektAnzufliigeUndDistanceScranke.Value.Value));
                    }
                }

                if (null != MengeObjektCargoZuDurcsuuce)
                {
                    AtomZwisceergeebnisMengeAufgaabeObjektZuBearbaite.AddRange(
                        MengeObjektCargoZuDurcsuuce.Select((InRaumObjekt) => AufgaabeParamAndere.AufgaabeAktioonCargoDurcsuuce(InRaumObjekt)));
                }

                if (null != MengeObjektZuZersctööre)
                {
                    AtomZwisceergeebnisMengeAufgaabeObjektZuBearbaite.AddRange(
                        MengeObjektZuZersctööre.Select((InRaumObjekt) => new AufgaabeParamDestrukt(InRaumObjekt)));
                }

                AtomZwisceergeebnis.MengeAufgaabeObjektZuBearbaite = AtomZwisceergeebnisMengeAufgaabeObjektZuBearbaite.ToArray();

                if (MengeObjektCargoZuDurcsuuce.IsNullOrEmpty())
                {
                    if (!AtomZwisceergeebnis.CargoDurcsuuceErfolgZait.HasValue)
                    {
                        AtomZwisceergeebnis.CargoDurcsuuceErfolgZait = ZaitMili;
                    }
                }
                else
                {
                    AtomZwisceergeebnis.CargoDurcsuuceErfolgZait = null;
                }

                if (MengeObjektZuZersctööre.IsNullOrEmpty())
                {
                    if (!AtomZwisceergeebnis.ZersctööreErfolgZait.HasValue)
                    {
                        AtomZwisceergeebnis.ZersctööreErfolgZait = ZaitMili;
                    }
                }
                else
                {
                    AtomZwisceergeebnis.ZersctööreErfolgZait = null;
                }

                if (ObjektAnzufliigeUndDistanceScranke.HasValue)
                {
                    AtomZwisceergeebnis.AnfliigeErfolgZait = null;
                }
                else
                {
                    if (!AtomZwisceergeebnis.AnfliigeErfolgZait.HasValue)
                    {
                        AtomZwisceergeebnis.AnfliigeErfolgZait = ZaitMili;
                    }
                }

                if (BedingungObjektExistentErfült)
                {
                    if (!AtomZwisceergeebnis.ObjektExistentErfolgZait.HasValue)
                    {
                        AtomZwisceergeebnis.ObjektExistentErfolgZait = ZaitMili;
                    }
                }
                else
                {
                    AtomZwisceergeebnis.ObjektExistentErfolgZait = null;
                }

                var ScritBedingungErfültBeruhigungszaitMili = InStrategikonAtom.ScritBedingungErfültBeruhigungszaitMili ?? 1000;

                var AtomZwisceergeebnisMengeScpezielErfültZaitNulbar = new Int64?[] {
                    AtomZwisceergeebnis.CargoDurcsuuceErfolgZait,
                    AtomZwisceergeebnis.ZersctööreErfolgZait,
                    AtomZwisceergeebnis.AnfliigeErfolgZait,
                    AtomZwisceergeebnis.ObjektExistentErfolgZait
                };

                if (AtomZwisceergeebnisMengeScpezielErfültZaitNulbar.Any((ScpezielErfültZaitNulbar) => !ScpezielErfültZaitNulbar.HasValue))
                {
                    //	Aine der Scpezialisiirte Aufgaabe isc noc nit erfült.
                    return;
                }

                ErfolgTailVorMengeOverviewObjektGrupeMesungZuErscteleZait =
                    Bib3.Glob.Max(AtomZwisceergeebnisMengeScpezielErfültZaitNulbar) ?? 0;

                var MesungMengeObjektGrupeZaitScrankeMin =
                    Bib3.Glob.Max(ErfolgTailVorMengeOverviewObjektGrupeMesungZuErscteleZait, MengeObjektGrupeMesungZaitScrankeMin) ?? 0;

                MesungMengeObjektGrupeZaitScrankeMinPlusBeruhigungszait =
                    MesungMengeObjektGrupeZaitScrankeMin + ScritBedingungErfültBeruhigungszaitMili;

                ZuMengeObjektGrupeMesungVolsctändigFeelend =
                    OverviewUndTarget.MengeObjektGrupeUntermengeOoneOverviewViewportFolgeVolsctändigNaacZait(
                        InStrategikonAtomMengeObjektFilterGrupe,
                        MesungMengeObjektGrupeZaitScrankeMin);

                if (!ZuMengeObjektGrupeMesungVolsctändigFeelend.IsNullOrEmpty())
                {
                    //	Verzwaigung Für Debug Haltepunkt
                }

                if (MesungMengeObjektGrupeZaitScrankeMinPlusBeruhigungszait < ZaitMili)
                {
                    /*
                     * 2014.06.12
                     *
                     * Korektur: Versciibe diise Blok naac finally um überscraibe des vorherige Wert mit null zu ermööglice fals try Blok scon vorher unterbroce werd.
                     *
                     * AtomZwisceergeebnis.MengeOverviewObjektGrupeMesungZuErsctele = ZuMengeObjektGrupeMesungVolsctändigFeelend;
                     *
                     * //	if (ZuMengeObjektGrupeMesungVolsctändigFeelend.Length < 1)
                     * if (Optimat.Glob.NullOderLeer(ZuMengeObjektGrupeMesungVolsctändigFeelend))
                     * {
                     *      AtomZwisceergeebnisErfolg = true;
                     * }
                     * */
                }
            }
            finally
            {
                AtomZwisceergeebnis.MengeOverviewObjektGrupeMesungZuErsctele = ZuMengeObjektGrupeMesungVolsctändigFeelend;

                /*
                 * 2014.07.10	Korektur: zuusäzlice Bedingung:
                 * MesungMengeObjektGrupeZaitScrankeMinPlusBeruhigungszait < ZaitMili
                 *
                 * //	if (ZuMengeObjektGrupeMesungVolsctändigFeelend.Length < 1)
                 * if (Optimat.Glob.NullOderLeer(ZuMengeObjektGrupeMesungVolsctändigFeelend))
                 * {
                 *      AtomZwisceergeebnisErfolg = true;
                 * }
                 * */

                if (MesungMengeObjektGrupeZaitScrankeMinPlusBeruhigungszait < ZaitMili)
                {
                    if (ZuMengeObjektGrupeMesungVolsctändigFeelend.IsNullOrEmpty())
                    {
                        AtomZwisceergeebnisErfolg = true;
                    }
                }

                AtomZwisceergeebnis.ErfolgTailVorMengeOverviewObjektGrupeMesungZuErscteleZait =
                    ErfolgTailVorMengeOverviewObjektGrupeMesungZuErscteleZait;

                if (ErfolgTailVorMengeOverviewObjektGrupeMesungZuErscteleZait.HasValue)
                {
                    AtomZwisceergeebnis.ErfolgTailVorMengeOverviewObjektGrupeMesungZuErscteleZaitLezte = ErfolgTailVorMengeOverviewObjektGrupeMesungZuErscteleZait;
                }

                if (AtomZwisceergeebnisErfolg)
                {
                    AtomZwisceergeebnis.EntscaidungErfolgLezteZait = ZaitMili;
                }
                else
                {
                    AtomZwisceergeebnis.EntscaidungErfolgLezteZait = null;
                }

                AtomZwisceergeebnis.AktualisiireTailEntscaidungErfolgFrühesteZait();
            }
        }