2009-08-28 103 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) 
...