Рассчитать оставшиеся дни отпуска для сотрудников в веб-приложении MVC? - PullRequest
0 голосов
/ 12 февраля 2020

Я занимаюсь разработкой отсутствующего приложения "C# - MVC5", которое будет ежедневно отслеживать состояние отсутствия каждого сотрудника. Таблицы:

  1. Таблица данных сотрудников:
    EmpID
    EmpName
    AllowedRegularVacations
    AllowedCasualVacations

  2. Таблица транзакций:
    ID
    EmpID
    EntryDate
    Состояние

Мне нужно получить список с EmpId, EmpName, RemainingRegularVaction, RemainingCasualVaction

Я получаю это с этим запросом:

-- Query to calculate remaining regular vactions and remaining casual vacations for each employee

select Employees.Name , (Employees.RegularVacations - ISNULL(Tak1.RequelarVacations,0)) as RemRegularVacations ,
(Employees.CasualVacations - ISNULL(Tak2.RequelarVacations,0)) as RemCasualVacations

from 
Employees left join (select  Employees.Id , count (Transactions.Id) as RequelarVacations
from Employees inner join Transactions on (Employees.Id = Transactions.EmpId)
where (StatusId = 3)
and (Transactions.EntryDate between '01-Jul-19' and '30-Jun-2020')
group by Employees.Id) as Tak1 on (Employees.id = Tak1.Id)

left join (select  Employees.Id , count (Transactions.Id) as RequelarVacations
from Employees inner join Transactions on (Employees.Id = Transactions.EmpId)
where (StatusId = 4)
and (Transactions.EntryDate between '01-Jul-19' and '30-Jun-2020')
group by Employees.Id) as Tak2 on (Employees.id = Tak2.Id)

Но как написать такой сложный запрос и получить результат в C# код MVC?

1 Ответ

0 голосов
/ 13 февраля 2020

После многих попыток я нашел решение, и оно сработало:

  1. Поскольку год в моей компании начинается с 01/07 по 30/06, я пишу этот код, чтобы получить Дата начала и дата окончания, которые я буду использовать в запросе:

        int month = DateTime.Now.Month;
        int year = DateTime.Now.Year;
        string startDate="";
        string endDate="";
    
        if (month >= 7 && month <= 12)
        {
             startDate = "01-07-" + year;
             endDate = "30-06-" + (year++);
        }
    
        else if (month >= 1 && month <= 6)
        {
             startDate = "01-07-" + (year - 1);
             endDate = "30-06-" + year;
        }
    
  2. Рассчитать взятые регулярные и случайные отпуска для каждого сотрудника из базы данных:

            DateTime startDateTime = Convert.ToDateTime(startDate);
            DateTime endDateTime = Convert.ToDateTime(endDate);
            //calculate Ordinary vacation
            var countOrdinaryVacation = (from trans in db.Transactions
                              where trans.StatusId == 3 &&
                    (trans.EntryDate >= startDateTime && trans.EntryDate <= endDateTime)
                              group trans by trans.EmpId into empg
    
                              select new
    
                              {
    
                                  key = empg.Key,
    
                                  OrdinaryVaction = empg.Count()
    
                              }).AsQueryable()  ;
            //calculate Casual Vacation 
            var countCasualVacation = (from trans in db.Transactions
                                         where trans.StatusId == 4 &&
                               (trans.EntryDate >= startDateTime && trans.EntryDate <= endDateTime)
                                         group trans by trans.EmpId into empg
    
                                         select new
    
                                         {
    
                                             key = empg.Key,
    
                                             CasualVacation = empg.Count()
    
                                         }).AsQueryable();
    
  3. получить список из таблицы сотрудников, чтобы получить разрешенные отпуска для каждого сотрудника:

    var employees = db.Employees.ToList();
    
  4. Создать новый класс модели представления, содержащий поля, которые мы будем используйте в представлении:

    public class EmpVacations
    {
    public int EmpId { get; set; }
    public string EmpName { get; set; }
    public int? AllowedRegularVacation { get; set; }
    public int? AllowedCasualVacation { get; set; }
    public int? TakenRegularVacation { get; set; }
    public int? TakenCasualVacation { get; set; }
    
    public int? RemRegularVacation { get; set; }
    public int? RemCasualVacation { get; set; }
    

    }

  5. составьте список типов EmpVacations в контроллере, который будет содержать все данные, необходимые для сотрудников:

    List<EmpVacations> empVacations = new List<EmpVacations>();
    foreach (var emp in employees)
            {
                EmpVacations emp1 = new EmpVacations();
                emp1.EmpId = emp.Id;
                emp1.EmpName = emp.Name;
                emp1.AllowedRegularVacation = emp.RegularVacations;
                emp1.AllowedCasualVacation = emp.CasualVacations;
                emp1.TakenRegularVacation = countOrdinaryVacation.Where(x => x.key == emp1.EmpId).FirstOrDefault() == null ? 0 : countOrdinaryVacation.Where(x => x.key == emp1.EmpId).FirstOrDefault().OrdinaryVaction;
                emp1.TakenCasualVacation = countCasualVacation.Where(x => x.key == emp1.EmpId).FirstOrDefault() ==null ? 0 : countCasualVacation.Where(x => x.key == emp1.EmpId).FirstOrDefault().CasualVacation;
            emp1.RemRegularVacation = emp1.AllowedRegularVacation - emp1.TakenRegularVacation;
            emp1.RemCasualVacation = emp1.AllowedCasualVacation - emp1.TakenCasualVacation;
            empVacations.Add(emp1);
    
                }
    
  6. отправить список в сумке для просмотра на просмотр

      ViewBag.EmpData = empVacations;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...