Domanda

Ho cercato di trovare il modo migliore per modellare questa entità e mi sono bloccato.Ecco il caso/storia d'uso di base:

Abbiamo attrezzature in arrivo sul posto.Non sapremo quale sia l'attrezzatura finché non arriverà.Una volta che l'attrezzatura arriva sul posto è necessario registrare come arrivata e se era inattiva o attiva.Se è attivo l'utente deve prendere nota del lavoro svolto dall'attrezzatura.Quando l'apparecchiatura lascia il sito, è necessario segnalarlo.

Dovrei essere in grado di chiedere facilmente se sono presenti attrezzature sul sito, quali attrezzature erano precedentemente presenti sul sito, ecc.

Mi sono bloccato sull'aspetto della data.Sto cercando di evitare di fare affidamento su un lavoro cron da eseguire e contrassegnare l'attrezzatura come inattiva se non è stata contrassegnata inattiva in una data particolare.Sembra che dovrebbe esserci un modo per farlo.Ecco cosa ho scoperto:

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; }
}

L'idea è che potrei eseguire una query del tipo Site.Equipment.Where(x=>x.Departure == null) per vedere quali attrezzature sono ancora sul posto.Se non è presente EquipmentUtilization per una data particolare, si presuppone che sia inattivo.Potrei quindi impostare un 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;
        }
    }
}

Crea un elenco di date dalla data di arrivo fino a DateTime.Now o DepatureDate se non è null.Per qualche ragione questo sembra brutto.Devo inserire l'enumeratore DateTime all'interno dell'oggetto Equipment?Sembra che tutto questo dovrebbe essere tutto insieme o fatto in modo diverso, anche se funziona se lo eseguo.Suggerimenti?

È stato utile?

Soluzione

Se ho capito bene, cerchi un modo per determinare quale attrezzatura è inattiva in un determinato sito in una determinata data in base agli oggetti di utilizzo dell'attrezzatura catturati associati alla tua raccolta Equipment (forse EquipmentResidency è un nome migliore?).

Poiché vuoi evitare di creare oggetti Equipmentutilization per i giorni di inattività (sono d'accordo che potrebbe essere una manutenzione significativa), che ne dici di aggiungere un metodo isIdleOn(Date) alla classe Equipmentutilization che restituisce true se la data passata corrisponde al ReportDate catturato e false se lo fa non?

La query associata sarebbe qualcosa sulla falsariga di Site.Equipment.Where(x=>x.equipmentutilization.isIdleOn(date) == true)

Non sono sicuro di avere la sintassi corretta, ma solo un suggerimento.

Altri suggerimenti

Un potenziale problema che vedo è che un pezzo di attrezzatura conosce solo il suo sito attuale.Se vuoi sapere se Loader123 era su SiteXYZ 2 mesi fa, non puoi recuperare tali informazioni utilizzando il tuo modello attuale.

Sembra che la granularità del tuo utilizzo riguardi un determinato giorno.Ciò rende sicuramente le cose più semplici, poiché non è necessario capire come monitorarlo, se un'apparecchiatura viene utilizzata dalle 23:00 alle 4:00 su SiteABC, quindi dalle 13:00 alle 17:00 su SiteXYZ.

Tenendo queste cose in mente, apportarei un paio di lievi modifiche al tuo modello.Manterrei una raccolta di tutti i siti in cui si trovava l'attrezzatura (Equipment.History) e fornirei una comoda funzione per trovare il sito in cui si trova attualmente (a seconda di quale SiteHistory.Departure non abbia un valore).Per gli utilizzi stessi, fornirei una comoda funzione per restituirli come dizionario, digitato da DateTime.Si potrebbero poi effettuare operazioni sulla raccolta chiavi di quel dizionario, per contare facilmente quanti giorni è stata effettivamente utilizzata un'apparecchiatura in un dato periodo.

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; }
}

Come con qualsiasi progetto veloce e sporco, sono sicuro che questo ha dei buchi e potrebbe richiedere alcuni perfezionamenti.Ma spero che ti avvicini un po' di più a ciò che stai cercando.

Personalmente non avrei un enumeratore DateTime;come hai detto tu, sembra sbagliato.

Devo ammettere che faccio fatica a seguirti qui quando dici che qualcosa dovrebbe essere classificato come inattivo.Qualunque cosa usi per determinare se qualcosa è inattivo, potresti essere inserito in una proprietà, ad esempio:

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))
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top