2

我一直在试图找出建模这个实体的最佳方法,但我陷入了困境。这是基本用例/故事:

我们有设备到达现场。在它到达之前,我们不会知道设备是什么。一旦设备到达现场,它必须被记录为已经到达以及它是空闲的还是活动的。如果它处于活动状态,用户必须记下设备执行的工作。当设备离开现场时,必须注意这一点。

应该可以很方便的查询到现场有没有设备,以前现场有什么设备等等。

我被困在日期方面。如果设备在特定日期没有被标记为空闲,我试图避免依赖 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),例如查看哪些设备仍在现场。如果特定日期没有 EquipmentUtilization,则假定它是空闲的。然后我可以设置一个 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 对象中吗?感觉这应该全部放在一起或以某种不同的方式完成,尽管如果我运行它确实有效。建议?

4

3 回答 3

1

如果我对您的理解正确,您寻求一种方法来根据与您的设备关联的捕获的设备利用率对象(也许 EquipmentResidency 是一个更好的名称?)集合来确定给定日期在给定站点上哪些设备处于空闲状态。

由于您想避免在空闲日创建设备使用对象(我同意这可能是重要的维护),如何将 isIdleOn(Date) 方法添加到设备使用类,如果传递的日期与捕获的 ReportDate 匹配则返回 true,如果匹配则返回 false不是?

相关查询将类似于 Site.Equipment.Where(x=>x.equipmentutilization.isIdleOn(date) == true)

不确定我的语法是否正确,但只是一个建议。

于 2010-08-06T21:46:23.127 回答
0

我看到的一个潜在问题是一台设备只知道它的当前站点。如果您想知道 Loader123 是否在 2 个月前在 SiteXYZ,则无法使用当前模型检索该信息。

看起来您的使用粒度是针对特定日期的。这肯定会让事情变得更简单,因为您不需要弄清楚如何跟踪它,如果在 SiteABC 的晚上 11 点至凌晨 4 点使用一台设备,然后在 SiteXYZ 的下午 1 点至 5 点使用一台设备。

考虑到这些事情,我将对您的模型进行一些细微的更改。我会收集设备所在的所有站点(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; }
}

与任何快速肮脏的设计一样,我相信这个有一些漏洞,并且可以使用一些改进。但希望它能让你更接近你正在寻找的东西。

于 2010-08-06T22:12:13.703 回答
0

我个人不会有 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))
        }
    }
}
于 2010-08-06T22:14:08.613 回答