Как мне моделировать объект для отслеживания оборудования / активов с течением времени? - PullRequest
2 голосов
/ 07 августа 2010

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

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

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

IЗастреваю на свидании.Я стараюсь не полагаться на выполнение задачи 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), чтобы увидеть, какое оборудование все еще находится на месте.Если для определенной даты нет использования оборудования, предполагается, что оно не используется.Затем я мог бы установить 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;
        }
    }
}

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

Ответы [ 3 ]

1 голос
/ 07 августа 2010

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

Поскольку вы хотите избежать создания объектов использования оборудования в течение нерабочих дней (я согласен, что это может быть значительным обслуживанием), как насчет добавления метода isIdleOn (Date) в класс equipmentutilization, который возвращает true, если переданная Date соответствует захваченному ReportDate и false если нет?

Связанный запрос будет выглядеть по принципу Site.Equipment.Where (x => x.equipmentutilization.isIdleOn (date) == true)

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

0 голосов
/ 07 августа 2010

Лично у меня не будет счетчика 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))
        }
    }
}
0 голосов
/ 07 августа 2010

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

Похоже, ваша гранулярность использования для данного дня.Это, безусловно, делает вещи проще, так как вам не нужно выяснять, как отследить это, если часть оборудования используется с 11:00 до 4:00 на SiteABC, а затем с 13:00 до 17:00 на SiteXYZ.

С этими вещамиЯ хотел бы сделать пару небольших изменений в вашей модели.Я бы сохранил коллекцию всех сайтов, на которых находилось оборудование (Equipment.History), и предоставил бы удобную функцию, чтобы найти сайт, на котором он находится в данный момент (какой бы ни была SiteHistory.Departure).Для самих утилит я бы предоставил удобную функцию, чтобы возвращать их в виде словаря с ключом 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; }
}

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

...