Рассчитать нефиксированный цикл дней от даты начала для ростера - PullRequest
0 голосов
/ 26 июня 2018

В рамках проекта моих сотрудников у меня есть график работы для бригад / смен работы.Интересно, каков наилучший способ проверить состояние на сегодняшний день (работа или выходной), если я работаю с нефиксированным графиком рабочих дней, например так: скажем, начальная дата ростера - 1 января 2018 года, а модель: первый деньэто утренняя смена (1 января: с 6 до 14 часов), затем второй день - дневная смена (2 января: с 14 до 22 часов), затем третий день - ночная смена (3 января: с 10 до 4 января 10 часов)затем четвертый и пятый дни (4 января и 5 января) - выходные, и после этого все начинается снова с 6 января в виде утренней смены и так далее.Итак, как вы видите, это не связано с днями недели (как обычно), поэтому мои переменные - это дата начала и шаблон.Каков наилучший подход к этому?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Вот пример функции, которая вычисляет состояние для даты:

void Main() {
    var workPattern = new List<DayState> { DayState.MorningShift, DayState.AfternoonShift, DayState.NightShift, DayState.OffDay, DayState.OffDay };
    var startDate = new DateTime(2018, 1, 1);

    var queryDate = new DateTime(2018, 1, 4);
    Console.WriteLine($"{queryDate:d} is {StateOfDate(startDate, workPattern, queryDate)}");

    queryDate = new DateTime(2018, 1, 21);
    Console.WriteLine($"{queryDate:d} is {StateOfDate(startDate, workPattern, queryDate)}");

    queryDate = new DateTime(2018, 2, 6);
    Console.WriteLine($"{queryDate:d} is {StateOfDate(startDate, workPattern, queryDate)}");

    queryDate = new DateTime(2018, 3, 4);
    Console.WriteLine($"{queryDate:d} is {StateOfDate(startDate, workPattern, queryDate)}");
}

// Define other methods and classes here
public enum DayState {
    MorningShift, AfternoonShift, NightShift, OffDay
};

public DayState StateOfDate(DateTime startDate, List<DayState> workPattern, DateTime queryDate) {
    var numDays = Math.Floor((queryDate-startDate).TotalDays);
    var patternOffset = ((int)numDays) % workPattern.Count;
    return workPattern[patternOffset];
}
0 голосов
/ 26 июня 2018

Просто для завершения я хотел бы предоставить следующий подход на основе классов:

public class Program
{
    static void Main(string[] args)
    {
        var shiftScheduler = new ShiftScheduler(new DateTime(2018, 01, 01));
        var requestedShift = shiftScheduler.GetShift(new DateTime(2018, 01, 05));

        Console.WriteLine(requestedShift.IsWorkDay
          ? $"Scheduled from ${requestedShift.HoursBegin}{requestedShift.MinutesBegin:00} " +
            $"to {requestedShift.HoursEnd}{requestedShift.MinutesEnd:00}"
          : "No work today");
    }

}

public class Shift
{
    public Shift(int hoursBegin, int hoursEnd, int minutesBegin, int minutesEnd, bool isWorkDay)
    {
        HoursBegin = hoursBegin;
        HoursEnd = hoursEnd;
        MinutesBegin = minutesBegin;
        MinutesEnd = minutesEnd;
        IsWorkDay = isWorkDay;
    }

    public int HoursBegin { get; set; }
    public int HoursEnd { get; set; }
    public int MinutesBegin { get; set; }
    public int MinutesEnd { get; set; }
    public bool IsWorkDay { get; set; }
}

public class ShiftScheduler
{
    private readonly Dictionary<int, Shift> _shifts = new Dictionary<int, Shift>();
    private readonly DateTime _startDate;

    public ShiftScheduler(DateTime startDate)
    {
        Initialize();
        _startDate = startDate;
    }

    private void Initialize()
    {
        _shifts.Add(0, new Shift(6, 14, 0, 0, true)); // Day 1
        _shifts.Add(1, new Shift(14, 22, 0, 0, true)); // Day 2
        _shifts.Add(2, new Shift(22, 6, 0, 0, true)); // Day 3
        _shifts.Add(3, new Shift(0, 0, 0, 0, false)); // Day 4, day off
        _shifts.Add(4, new Shift(0, 0, 0, 0, false)); // Day 5, day off
    }

    public Shift GetShift(DateTime targetDate)
    {
        int days = (int)Math.Floor((targetDate - _startDate).TotalDays);
        if (days < 0)
        {
            throw new ArgumentException("Target date prior to start date.");
        }

        Shift targetShift;
        _shifts.TryGetValue(days % _shifts.Count, out targetShift);
        return targetShift;
    }
}
0 голосов
/ 26 июня 2018

Как насчет этого: Ps: если вам не нравится устанавливать флаг IsOff из конструктора, вы должны установить его как метод Set свойства Date

public Class WorkDay
{
    public DateTime Date { get; set; }
    public ShiftType ShiftType { get; set; }
    public bool IsOff { get; set;}
    public string HolidayName { get; set; }

    public WorkDay(DateTime date)
    {
          Date = date;
          if (date.DayOfWeek = DayOfWeek.Saturday || date.DayOfWeek = DayOfWeek.Sunday )
          IsOff = true;
    } 
}



enum ShiftType 
{
   Morning, Mid , Night
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...