Question

J'ai essayé de trouver la meilleure façon de modéliser cette entité, et je suis en train coincé. Voici le cas / histoire d'utilisation de base:

Nous avons l'équipement arrivant sur place. Nous ne saurons pas ce que l'équipement est jusqu'à ce qu'il arrive. Une fois l'équipement arrive sur place, il doit être enregistré comme étant arrivé et si elle était inactif ou actif. Si elle est active, l'utilisateur doit prendre note du travail effectué l'équipement. Lorsque les feuilles d'équipement du site, il faut noter.

Je devrais pouvoir facilement vérifier s'il y a un équipement sur le site, quel équipement était déjà sur place, etc.

Je suis bloqué sur l'obtention aspect de la date. J'essaie d'éviter de se fier à une tâche cron à courir à travers et de l'équipement comme marque de repos si elle n'a pas été marquée au ralenti à une date paticular. Il se sent comme il devrait y avoir une façon de le faire. Voici ce que je suis venu avec:

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'idée étant que je pouvais exécuter une requête comme Site.Equipment.Where(x=>x.Departure == null) pour voir quels équipements sont encore sur place. S'il n'y a pas EquipmentUtilization pour une date donnée, il est suppose ne pas être inactif. Je pourrais alors installer 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;
        }
    }
}

Dressez une liste de dates de la date d'arrivée jusqu'à DateTime.Now ou DepatureDate si ce n'est pas nulle. Pour une raison quelconque, cela semble laid. Dois-je mettre l'intérieur de recenseur DateTime par objet équipement? Il se sent comme cela devrait être tous ensemble ou fait d'une certaine manière différente, bien que cela fonctionne si je le lance. Suggestions?

Était-ce utile?

La solution

Si je vous comprends bien, vous cherchez un moyen de déterminer quel équipement est inactif sur un site donné à une date donnée sur la base des objets equipmentutilization capturé associé à votre collection L'équipement (peut-être EquipmentResidency est un meilleur nom?).

Comme vous voulez éviter la création d'objets equipmentutilization pour les jours de repos (je suis d'accord qui pourrait être une maintenance importante), que diriez-vous d'ajouter une méthode isIdleOn (date) à la classe equipmentutilization qui retourne true si la date passée correspond à la capture ReportDate et faux si elle ne le fait pas?

La requête associée serait quelque chose le long des lignes de Site.Equipment.Where (x => x.equipmentutilization.isIdleOn (date) == true)

Je ne sais pas si j'ai le droit de syntaxe, mais juste une suggestion.

Autres conseils

Un problème potentiel que je vois est une pièce d'équipement ne connaît son emplacement actuel. Si vous voulez savoir si Loader123 était SiteXYZ il y a 2 mois, vous ne pouvez pas récupérer ces informations, en utilisant votre modèle actuel.

Il ressemble à votre granularité d'utilisation est pour un jour donné. Cela rend certainement les choses plus simples, comme vous n'avez pas besoin de savoir comment suivre, si une pièce d'équipement est utilisé à partir de 23 heures-4 heures SiteABC, puis sur SiteXYZ 13 heures-à-dix-sept heures.

Avec ces choses à l'esprit, je faire quelques légères modifications à votre modèle. Je garderais une collection de tous les sites de l'équipement avait été à (Equipment.History) et fournir une fonction pratique pour trouver le site, il est actuellement (selon SiteHistory.Departure n'a pas de valeur). Pour les mêmes utilisations, je fournirais une fonction pratique pour les retourner comme le dictionnaire, par calée DateTime. Vous pouvez ensuite effectuer des opérations sur la remise des clés de ce dictionnaire, de compter facilement combien de jours une pièce d'équipement a été effectivement utilisé dans une période donnée.

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

Comme pour toute conception rapide n-sale, je suis sûr que celui-ci a quelques trous, et pourrait utiliser quelques améliorations. Mais nous espérons qu'il vous est un peu plus proche de ce que vous cherchez.

Je ne serait pas un recenseur DateTime personnellement; comme vous l'avez dit, il sonne faux.

Je dois admettre que je me bats pour vous suivre ici quand vous dites quelque chose devrait être classé comme inactif. Tout ce que vous utilisez pour déterminer si quelque chose est inactif que vous pourriez mettre dans une propriété, par exemple:

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))
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top