¿Cómo puedo modelar un objeto para realizar un seguimiento de los equipos / activos en el tiempo?

StackOverflow https://stackoverflow.com/questions/3427772

Pregunta

He estado tratando de averiguar la mejor manera de modelar esta entidad, y yo estoy atascado. Aquí está la básica caso de uso / historia:

Tenemos equipos que llegan en el sitio. No vamos a saber lo que es el equipo hasta que llegue. Una vez que el equipo llega en el lugar que debe ser recordado por haber llegado y si era inactivo o activo. Si está activo el usuario debe hacer nota de la labor del equipo lleva a cabo. Cuando las hojas de equipo del sitio, esto debe tenerse en cuenta.

Yo debería ser capaz de fácil consulta, si existe algún equipo en el lugar, lo que antes era el equipo en el hotel, etc.

Me estoy poniendo atascado en el aspecto fecha. Estoy tratando de evitar depender de una tarea programada para ejecutarse a través de equipos y la marca como inactivo si no se ha marcado una fecha de inactividad en paticular. Se siente como debería haber una manera de hacer esto. Esto es lo que he llegado con:

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

La idea es que podría correr una consulta como Site.Equipment.Where(x=>x.Departure == null) para ver qué equipo todavía está en el sitio. Si no hay EquipmentUtilization una fecha en concreto, es asumir tareas estar inactivo. Pude entonces configurar 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;
        }
    }
}

Construir una lista de fechas de la fecha de llegada hasta DateTime.Now o DepatureDate si eso no es nulo. Por alguna razón esto parece feo. ¿Debo poner el interior empadronador DateTime por objeto Equipo? Se siente como este debería estar todos juntos o hecho de alguna manera diferente, aunque esto funciona si lo ejecuto. Sugerencias?

¿Fue útil?

Solución

Si he entendido bien, busca una manera de determinar qué equipo está inactivo en un sitio determinado en una fecha determinada en base a la equipmentutilization capturado objetos asociados con su equipo (tal vez EquipmentResidency es un nombre mejor?) Colección.

A medida que se quiere evitar la creación de objetos equipmentutilization para los días de inactividad (estoy de acuerdo que podría ser significativo de mantenimiento), ¿qué hay de la adición de un método isIdleOn (Fecha) a la clase equipmentutilization que devuelve verdadero si la fecha pasada coincide con el ReportDate y falso capturado si no lo hace?

La consulta asociada sería algo en la línea de Site.Equipment.Where (x => x.equipmentutilization.isIdleOn (fecha) == true)

No estoy seguro si tengo el derecho de sintaxis, pero sólo una sugerencia.

Otros consejos

Un problema potencial que veo es una pieza de equipo sólo conoce su sitio actual. Si desea saber si estaba en Loader123 SiteXYZ hace 2 meses, no se puede recuperar esa información, el uso de su modelo actual.

Parece que a la granularidad de uso es para un día determinado. Que sin duda hace que las cosas más simples, ya que no es necesario encontrar la manera de realizar un seguimiento de que, si una pieza de equipo se utiliza de 11 p.m.-04 a.m. en SiteABC, a continuación, 13:00-17:00 en SiteXYZ.

Con estas cosas en mente, me gustaría hacer un par de ligeros cambios en su modelo. Me gustaría mantener una colección de todos los sitios del equipo había sido al (Equipment.History), y proporcionar una función de conveniencia para encontrar el sitio que es actualmente (lo que SiteHistory.Departure no tiene un valor). Para los propios usos, me gustaría proporcionar una función de conveniencia para devolverlos como diccionario, introducido por DateTime. A continuación, puede operar sobre la recogida de llaves de ese diccionario, a contar fácilmente el número de días a la pieza de equipo se utilice realmente en un plazo determinado.

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

Al igual que con cualquier diseño sucia rápida-n-, estoy seguro de que éste tiene algunos agujeros, y podría usar algunas mejoras. Pero es de esperar que se pone un poco más cerca de lo que estás buscando.

No tendría un empadronador DateTime personalmente; como usted ha dicho, suena mal.

he de reconocer que estoy luchando para seguir aquí cuando se dice algo debe ser clasificado como inactivo. Lo que usted utiliza para determinar si algo está inactivo que podría ser puesto en una propiedad, por ejemplo:

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))
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top