2009-08-28 57 views
2

我正在编写一个C#程序来处理调度。现在,每个员工都需要在他们的时间表前的能力有局限性:员工限制

萨利只能从9 am-3pm周一上班,周三,周五

比利只能从5 pm-9pm工作周二,周四,周日

萨利只能从9 am-3pm 工作周一,周三,周五至某某日期,然后她可以工作一组不同的时间和日期。

这些是我需要应用于每个员工对象的一些限制示例。我想要的是关于如何尽可能有效且一般地构建这些建议的一些建议。显然我必须能够访问这些数据并能够应用这些限制。例如,当经理试图制定时间表时,他需要能够看到当他周四在4点安排萨利时,他们是一个问题。另外我应该如何存储每个员工的这些数据?

回答

1

是这样的:

public class Employee 
{ 
    public string Name { get; set; } 
    // other important info 

    private List<WorkTime> _availability = new List<WorkTime>(); 
    public List<WorkTime> Availability 
    { 
     get { return _availability; } 
     internal set { _availability = value; } 
    } 
} 

public class WorkTime 
{ 
    public DayOfWeek Day { get; private set; } 
    public int StartHour { get; private set; } 
    public int EndHour { get; private set; } 

    public WorkTime(DayOfWeek day, int startHour, int endHour) 
    { 
     // validation here (e.g. day and time range during store hours, start<end, etc.) 

     Day = day; 
     StartHour = startHour; 
     EndHour = endHour; 
    } 
} 

,并使用LINQ(或的foreach)跨雇员收集查询,并为每个员工的可用性找人与时间,以满足一些转变。

也可能是创建基于业务规则的比较工作时间的物体一些实用功能(扩展)有用(如IsAvailable比较两个工作时间对象,并返回true,如果是相同的道琼斯指数和至少4小时重叠)

,你可能会将它存储在数据库中,因此使用像类中的属性这样的字段对表进行建模。

0

我建议给存储的时间关“与时间范围或为一种模式具体日期的能力。我曾参与过一些调度系统,这些系统具有处理工会规则和员工可用性的非常复杂的方式,这就是我们如何处理它的。

任何员工都说我希望X日从y到z关闭,这很容易检查,或者他们可以定义他们想要或不想要的模式(例如,我不想在星期五工作),然后在安排时间可以检查是否将它们应用于特定的班次违反了规定的规则(休息日)或者与特定模式不匹配。

而且应该怎么保存每个员工的这些数据?

具有用于存储雇员的特殊例外情况的表格。我想从X到Z的第X天。你有一个员工的日期和时间跨度。很简单。

至于模式,你需要拿出一些类型的模式。并有类型或其他东西。

所以你可以有一个像'每周关闭模式'这样的类型,它可以存储一整周的一整天,可以存储为表示关闭日期的简单字符串:1000001。假设第一位是星期日,这将表示想要周末休息。然后,您可以将模式存储为字符串或其他东西,然后基于定义的类型,您将知道如何处理字符串。

它可以是一个非常复杂或简单的问题,它只是取决于你需要多少的定制允许。希望这给你足够的想法让你开始。

自动日程产生很多更复杂的取决于你需要支持例外/规则。

+1

基本上是一个不错的设计 - 但 - 我会反转这个让“时间”是您存储的东西。这毕竟是你真正感兴趣的。位图看起来很有吸引力,但最终会成为一个真正的痛苦。我可能会将它作为emp,available_from,avalable_to存储在数据库中。这可以让管理员查询“在Satautday Afternoon下的whos”,而且bitmaps只能给你一个在这里或者不在这里的数据,存储在一个db中给你提供了更多的选项,比如在紧急情况下可以使用的时间表。 – 2009-08-28 02:23:55

+0

我的例子是任何模式,你可以存储任何东西,考虑到时间比时间更常见,我还没有看到任何存储可用性数据的调度系统,关键是不使用绝对数据。 – Kelsey 2009-08-28 03:09:14

0

“建筑师以此为高效,一般尽可能”

这些并不是相互排斥的,每本身,但是高效和通用真的很难拉断,尤其是在调度系统。调度是一个不平凡的问题。

您的问题可能会更好地表述为“我应该读什么书才能开始使用?”和/或使其成为社区wiki。

0

我做了类似的事情,我所做的是创建一个通用接口,然后为不同的场景创建单独的实现。该接口可能会检查IsInSchedule(dateTime)。然后你可以根据需要创建不同的实现。

1

我会Rules使用strategy pattern去。

public interface Rule 
{ 
    bool Satisfies(Employee employee); 
} 

public class ScheduleRule : Rule 
{ 
    ScheduleRule(Schedule schedule) 
    { ... } 

    bool Satisfies(Employee employee) 
    { 
     // Ensure the employee is available 
    } 
} 

public class HolidayRule : Rule 
{ 
    HolidayRule(Datetime date) 
    { ... } 

    bool Satisfies(Employee employee) 
    { 
     // Checks if the employee as volunteered for this holiday 
    } 
} 

该模式允许简单的扩展性和可维护性。

可以与员工保持可用性信息(以及其他与规则相关的信息)(请参阅Mike Jacob的回答)。然而,它可以与员工一起存储或存储在单独的表格中。

如果您希望获得大量与规则相关的信息,您还可以将此可用性信息与员工分开。在这种情况下,Rules可以瞄准其他类:

... 
bool Satisfies(RuleInfo info) 
...