Как моделировать объект для отслеживания оборудования / активов с течением времени?

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

Вопрос

Я пытался выяснить лучший способ моделировать эту сущность, и я застрял. Вот основное использование Case / Store:

У нас есть оборудование, прибывающее на сайт. Мы не будем знать, что оборудование до него приедет. После того, как оборудование прибудет на сайт, он должен быть записан, как приехав, и был ли он простаиваться или активным. Если он активен, пользователь должен отметить заметку работы, которое выполнено оборудование. Когда оборудование оставляет сайт, это необходимо отметить.

Я должен быть в состоянии легко запросить, есть ли какое-либо оборудование на сайте, какое оборудование было ранее на сайте и т. Д.

Я застрял на аспекте даты. Я пытаюсь избежать полагаться на работу CRON, чтобы пройти и пометить оборудование как простаиваться, если оно не было отмечено холостым языком на пикателярной дате. Это похоже на то, что должен быть способ сделать это. Вот что я придумал:

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

Идея в том, что я могу запустить запрос, как Site.Equipment.Where(x=>x.Departure == null) Чтобы увидеть, какое оборудование все еще на месте. Если нет оборудования для определенной даты, это предположить, не простаивает. Затем я мог настроить DateTimeuremerator:

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

Создайте список дат от даты прибытия до DateTime.Now или DataTartate, если это не ноль. По какой-то причине это кажется уродливым. Должен ли я поставить перечислитель DateTime внутри объекта оборудования? Таким образом, все это должно быть вместе или выполнено по-разному, хотя это работает, если я бегу. Предложения?

Это было полезно?

Решение

Если я вас правильно понимаю, вы ищете способ определить, какое оборудование простаивает на данном сайте на заданной дате, основанном на снятых объектах оборудования, связанных с вашим оборудованием (возможно, Exportsidency - это лучшее имя?) Коллекция.

Как вы хотите избежать создания объектов оборудования для простоях дней (я согласен, что может быть значительным обслуживанием), как насчет добавления метода Isidleon (Date) в класс оборудования, который возвращает true, если прошедшая дата соответствует захваченному отчету нет?

Ассоциированный запрос был бы чем-то вдоль линий сайта. Lequipment. Где (x => x.equibleutization.isidleon (дата) == true)

Не уверен, если у меня есть синтаксис справа, но просто предложение.

Другие советы

Одна потенциальная проблема, которую я вижу, это часть оборудования знает только его текущий сайт. Если вы хотите знать, если Loader123 был в Sitexyz 2 месяца назад, вы не можете получить эту информацию, используя вашу текущую модель.

Похоже, ваша гранулярность использования на данный день. Это определенно делает все более простые, так как вам не нужно выяснить, как отслеживать его, если часть оборудования используется с 11 PM-4AM на SiteABC, затем 1 PM-5PM на SiteXyz.

С учетом этих вещей я бы сделал пару небольших изменений в вашей модели. Я бы сохранил коллекцию всех сайтов. Оборудование было на (оборудование. Для самих использований я бы предоставил удобную функцию, чтобы вернуть их в виде словаря, ключ от DateTime. Затем вы можете выполнять операции на этой коллекции ключей словаря, чтобы легко подсчитать, сколько дней листья оборудования фактически использовалась в течение определенного периода.

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

Как и в случае любого быстрого N-грязного дизайна, я уверен, что у этого есть некоторые отверстия и могут использовать некоторые уточнения. Но, надеюсь, это дает вам немного ближе к тому, что вы ищете.

У меня не будет лично повторного перечисления DateTime; Как вы сказали, это звучит не так.

Я должен признать, что я борюсь, чтобы следовать за вами здесь, когда вы говорите, что что-то должно быть классифицировано как простаистым. Что бы вы ни использовали, чтобы определить, является ли что-то бездействовать, вы можете быть введены в недвижимость, например:

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))
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top