Как рассчитать рабочее время для сотрудников, когда у меня есть время, когда "в" и "вне" - PullRequest
0 голосов
/ 15 января 2019

Итак, у меня есть база данных, которая связана с устройством у двери, которое сотрудники проверяют, когда они приходят и уходят, теперь я могу получить историю статусов, но я хотел знать, как я могу рассчитать рабочее время для дня неделю и месяц для каждого сотрудника. Я получил этот класс для сотрудника.

public class Employee : BaseEntity
{        
    public Employee()
    {
        this.HistoryOfStatuses = new List<Checkinout>();
        this.TodayCheckedStatus = new List<Checkinout>();
    }

    public string Name { get; set; }
    public string Department { get; set; }
    public string CardNumber { get; set; }
    public string Status { get; set; }
    public byte[] Picture { get; set; }
    public Checkinout ActualCheckinStatuse { get; set; }
    public List<Checkinout> HistoryOfStatuses { get; set; }
    public List<Checkinout> TodayCheckedStatus { get; set; }
    public int UserId { get; internal set; }

А это класс статуса проверки

public class Checkinout : BaseEntity
{
    public Checkinout()
    {
    }
    public int EmployeeId { get; set; }
    public string CheckStatus { get; set; }
    public DateTime CheckTime { get; set; }
    public Employee EmployeeObject { get; set; }

}

Мой контроллер выглядит примерно так

public IActionResult Index()
    {
        using (var context = new RSAT.Api.Data.Proxy.ATT2018NOVUSContext())
        {
            var baseViewModel = base.GetLayoutViewModel();
            var viewModel = new HomeViewModel()
            {
                User = baseViewModel.User,
                RoleCollection = baseViewModel.RoleCollection,
                TableCollection = baseViewModel.TableCollection,
                //Olap = baseViewModel.Olap,
                //Localization = baseViewModel.Localization,
                EmployeeCollection = (from userinfo in context.Userinfo
                                      join department in context.Dept on userinfo.Deptid equals department.Deptid
                                      select new Employee()
                                      {
                                          Id = userinfo.Userid,
                                          Name = userinfo.Name,
                                          Picture = userinfo.Picture,
                                          Department = department.DeptName,
                                          CardNumber = userinfo.CardNum,
                                          Status = userinfo.UserFlag.ToString(),
                                          ActualCheckinStatuse = (from checkinout in context.Checkinout
                                                                  join status in context.Status on checkinout.CheckType equals status.Statusid
                                                                  where checkinout.Userid == userinfo.Userid
                                                                  orderby checkinout.CheckTime descending
                                                                  select new Checkinout
                                                                  {
                                                                      CheckStatus = status.StatusText,
                                                                      CheckTime = checkinout.CheckTime
                                                                  }).FirstOrDefault()
                                      }).ToList()
            };
            return View(viewModel);
        }
    }

    public IActionResult WorkingHours()
    {
        var inTime = "10:00";
        var outTime = DateTime.Now.TimeOfDay;
        var totalHours = Convert.ToDateTime(inTime).TimeOfDay.Subtract(outTime);
    }

Я хотел, чтобы кто-нибудь помог мне разобраться, как это сделать и как я могу подключить последний код в моем контроллере.

1 Ответ

0 голосов
/ 15 января 2019

Есть ли у вашей модели свойство где-то, определяющее, является ли вход входным или выходным чеком? Вам это понадобится.

Теперь вы можете создать метод, который принимает две даты, образующие диапазон. Вы можете вернуть общее количество рабочих часов в этом диапазоне. Затем можно легко создать метод для недели, месяца и года, в котором вы указываете диапазоны дат для этого метода.

Вот какой-то псевдокод, чтобы вы начали.

decimal GetRangeWorkHours(Employee employee, DateTime startOfRange, DateTime endOfRange){
    //1. Ask the database for all the entries from this employee within the range of dates.
    //2. Sort them by date, figuring out what entry the start/end is. You might get some edgecases where employees clock out midday and then clock back in later on the day. You can work this out using TimeSpans.
    //3. Calculate the difference between all the now paired in/out entries.
    //4. Sum the results of the previous step, return the result.
}

Потребление за неделю / месяц / год становится легким

Employee someEmployee = new Employee(/*wetherever you use to identify employees*/);
//Replace these 2 values with whatever you need to provide your user with.
DateTime startOfRange = new DateTime(2019, 1, 1);
DateTime endOfRange = startOfRange.AddDays(7);
decimal workHours = GetRangeWorkHours(someEmployee, startOfRange, endOfRange);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...