Frage

Ich habe versucht, den besten Weg, um herauszufinden, diese Einheit zu modellieren, und ich bin immer stecken. Hier ist die grundlegende Anwendungsfall / Geschichte:

Wir haben Geräte vor Ort ankommen. Wir werden nicht wissen, was die Ausrüstung ist, bis es ankommt. Sobald die Geräte vor Ort ankommt, muss sie als, angekommen aufgezeichnet werden und ob es sich um frei oder aktiv. Wenn es aktiv ist, muss der Benutzer Kenntnis von den Arbeiten machen das Gerät durchgeführt. Wenn die Ausrüstung Blätter der Ort, muss diese beachtet werden.

Ich soll Abfrage leicht in der Lage sein, ob es eine Ausrüstung auf dem Gelände ist, welche Ausrüstung vorher vor Ort war, etc.

Ich bin immer am Tag Aspekt stecken. Ich versuche, auf einem cron-Job zu vermeiden, unter Berufung durch und Marke Ausrüstung als im Leerlauf laufen zu lassen, wenn er nicht untätig auf einem paticular Datum markiert wird. Es fühlt sich an wie es sollte eine Art und Weise, dies zu tun. Hier ist, was ich habe kommen mit:

public class Equipment {
    public int Id { get; set; }
    public Site Site { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime Departure { get; set; }
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
}

public class EquipmentUtilization {
    public int Id { get; set; }
    public Equipment Equipment { get; set; }
    public DateTime ReportDate { get; set; }
    public string WorkPerformed { get; set; }
}

Die Idee ist, dass ich eine Abfrage wie Site.Equipment.Where(x=>x.Departure == null) laufen konnte, um zu sehen, welche Geräte noch vor Ort ist. Wenn es keine EquipmentUtilization für ein bestimmtes Datum ist, ist es übernimmt untätig do sein. Ich konnte dann ein Setup DateTimeEnumerator:

public class DateTimeEnumerator : System.Collections.IEnumerable
{
    private DateTime begin;
    private DateTime end;

    public DateTimeEnumerator ( DateTime begin , DateTime end ) 
    {            
        this.begin = begin;
        this.end = end;
    }
    public System.Collections.IEnumerator GetEnumerator()
    {
        for(DateTime date = begin; date < end; date = date.AddDays(1))
        {
            yield return date;
        }
    }
}

Erstellen Sie eine Liste von Daten aus dem Anreisedatum bis DateTime.Now oder DepatureDate wenn das nicht null ist. dies scheint aus irgendeinem Grund hässlich. Soll ich den Enumerator Datetime innerhalb von Ausrüstung Objekt? Es fühlt sich an wie das alles in irgendeiner anderen Weise getan wird zusammen oder sollte, obwohl dies funktioniert, wenn ich es laufen. Vorschläge?

War es hilfreich?

Lösung

Wenn ich Sie richtig verstehe, suchen Sie einen Weg, um zu bestimmen, welche Geräte an einer bestimmten Stelle zu einem bestimmten Zeitpunkt auf dem erfassten equipmentutilization basierend Leerlauf ist, Objekte im Zusammenhang mit Ihrer Ausrüstung (vielleicht EquipmentResidency ist ein besserer Name?) Sammlung.

Wie Sie equipmentutilization Objekte für Ruhetage zu schaffen vermeiden wollen (Ich bin einverstanden, dass erhebliche Wartung sein könnte), wie etwa eine isIdleOn (Datum) Verfahren zum equipmentutilization Klasse hinzu, dass true zurück, wenn der übergebene Datum entspricht dem erfassten ReportDate und falsch wenn es nicht?

Die zugehörige Abfrage würde etwas entlang der Linien von Site.Equipment.Where (x => x.equipmentutilization.isIdleOn (Datum) == true)

sein

Nicht sicher, ob ich die Syntax richtig, aber nur ein Vorschlag.

Andere Tipps

Ein potentielles Problem, das ich sehe, ist ein Gerät nur seinen aktuellen Standort kennt. Wenn Sie wissen wollen, ob Loader123 bei SiteXYZ 2 vor Monaten war, können Sie diese Informationen nicht abrufen, Ihr aktuelles Modell.

Es sieht aus wie Ihre Granularität der Verwendung für einen bestimmten Tag ist. Das auf jeden Fall macht die Dinge einfacher, da Sie nicht brauchen, um herauszufinden, wie es zu verfolgen, wenn ein Gerät von 23.00 bis 4.00 Uhr auf SiteABC verwendet wird, dann von 13.00 bis 17.00 Uhr auf SiteXYZ.

Mit diesen Dingen im Kopf, würde ich ein paar geringfügige Änderungen an Ihr Modell machen. Ich würde eine Sammlung aller Standorte halten die Ausrüstung an (Equipment.History) gewesen war, und bieten eine Komfort-Funktion der Website ist es zur Zeit an (je nachdem, was SiteHistory.Departure nicht einen Wert) zu finden. Für die Auslastungen selbst, würde ich eine Komfortfunktion, um sie als Wörterbuch zurückzukehren, verkeilt von Datetime. Sie könnten dann Operationen tun auf dieser Taste Sammlung Wörterbuch, zu leicht zu zählen, wie viele Tage ein Gerät tatsächlich innerhalb eines bestimmten Zeitraums verwendet wurde.

public class Equipment 
{
    public int Id { get; set; }
    public IList<SiteHistory> History { get; set; }
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }
    public IDictionary<DateTime, EquipmentUtilization> UtilizationsDictionary { get{...} }
    public Site CurrentSite { get{...} }
}

public class SiteHistory {
    public Site Site { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime? Departure { get; set; }
}

public class EquipmentUtilization {
    public int Id { get; set; }
    public Equipment Equipment { get; set; }  // is this a circular-reference back to the parent?  Might be able to omit it.
    public DateTime ReportDate { get; set; }
    public string WorkPerformed { get; set; }
}

Wie bei jedem Schnell n-dirty-Design, ich bin sicher, dass dies ein paar Löcher hat, und einige Verfeinerungen nutzen könnte. Aber hoffentlich wird es Ihnen ein wenig näher an, was Sie suchen.

Ich würde nicht einen Datetime-Enumerator persönlich hat; wie Sie gesagt haben, es klingt falsch.

Ich muss zugeben, ich bin zu kämpfen, Sie hier zu folgen, wenn Sie etwas sagen sollte als frei eingestuft werden. Was auch immer Sie verwenden, um festzustellen, ob etwas frei ist man in einer Eigenschaft genommen werden kann, z:

public class Equipment
{ 
    public int Id { get; set; } 
    public Site Site { get; set; } 
    public DateTime Arrival { get; set; } 
    public DateTime Departure { get; set; } 
    public IList<EquipmentUtilization> EquipmentUtilizations { get; set; }

    public bool IsIdle
    {
        get
        {
            // This checks if the EquipmentUtilizations is empty
            // or if the Equipment is older than three days
            return (this.EquipmentUtilizations == null) ||
                   ((this.Departure == null) &&
                    (this.Arrival < DateTime.Today.AddDays(-3))
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top