2010-08-06 26 views
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对象的内部吗?感觉这应该全部在一起或以不同的方式完成,尽管如果我运行它,这确实起作用。建议?

回答

1

如果我的理解正确,您将寻求一种方法,根据与您的设备相关的捕获设备利用对象(也许EquipmentResidency是一个更好的名称?)收集来确定给定日期的给定站点处闲置的设备。

由于您希望避免在空闲时间创建设备利用对象(我同意这可能是重大维护),那么如何将isIdleOn(Date)方法添加到equipmentutilization类中,如果传递的Date匹配捕获的ReportDate,则返回true;如果它不是?

相关的查询将沿着Site.Equipment.Where东西线(X => x.equipmentutilization.isIdleOn(日期)==真)

不知道我是否有语法正确的,但只一条建议。

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

与任何quick-n-dirty设计一样,我敢肯定这个设计有一些漏洞,可以使用一些改进。但希望它能让你更接近你想要的东西。

0

我不会有一个DateTime枚举亲自;就像你说的那样,这听起来不对。

我必须承认,我挣扎在这里跟着你时,你说什么应该被归类为闲置。不管你用它来确定,如果事情是闲置你可以放在一个属性,e.g:

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)) 
     } 
    } 
} 
相关问题