/
WorkerTime
/
WorkerTimeDiplom
Обзор
Документация
Войти
/
WorkerTime
/
WorkerTimeDiplom
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Services/ReportService.cs
136 строк
4 KB
nikit
Логирование, автосохранение, восстановление пароля
05 июн 2026, 19:24
05 июн 2026, 19:24
715eb3d
Код
Авторство
О чём код?
using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; namespace WorkerTime.Services { public class ReportService { private readonly AppDbContext _db; private readonly WorkRecordService _workRecordService; public ReportService(AppDbContext db) { _db = db; _workRecordService = new WorkRecordService(db); } public class TimesheetRow { public string PersonnelNumber; public string FullName; public string[] DayCodes; public string[] DayHours; public int TotalDays; public int TotalHours; } public class Timesheet { public string OrganizationName; public string Department; public int Year; public int Month; public int DaysInMonth; public List<TimesheetRow> Rows; public Timesheet() { OrganizationName = ""; Department = ""; Rows = new List<TimesheetRow>(); } } //Табель для выбранного подразделения за месяц public Timesheet GenerateForDepartments(int year, int month, List<int> departmentIds) { int daysInMonth = DateTime.DaysInMonth(year, month); Timesheet timesheet = new Timesheet(); timesheet.Year = year; timesheet.Month = month; timesheet.DaysInMonth = daysInMonth; //Ищем из нужного List<Employee> allEmployees = new List<Employee>(); foreach (Employee e in _db.Employees.Include(e => e.Department)) { if (departmentIds.Contains(e.DepartmentId)) { allEmployees.Add(e); } } //По фамилии allEmployees.Sort((a, b) => a.LastName.CompareTo(b.LastName)); //Коды рабочих дней HashSet<string> workCodes = new HashSet<string>(); workCodes.Add("Я"); workCodes.Add("ОТ"); workCodes.Add("ОД"); workCodes.Add("С"); workCodes.Add("Н"); workCodes.Add("РП"); workCodes.Add("ВМ"); workCodes.Add("У"); workCodes.Add("К"); workCodes.Add("ПК"); workCodes.Add("ПМ"); foreach (Employee employee in allEmployees) { List<WorkRecord> records = _workRecordService.GetByMonth(employee.Id, year, month); TimesheetRow row = new TimesheetRow(); row.PersonnelNumber = employee.PersonnelNumber; row.FullName = employee.LastName + " " + employee.FirstName + " " + employee.MiddleName; row.DayCodes = new string[daysInMonth]; row.DayHours = new string[daysInMonth]; int totalDays = 0; int totalHours = 0; for (int day = 1; day <= daysInMonth; day++) { //Дата в формате ГГГГ-ММ-ДД string dateStr = year.ToString() + "-" + month.ToString("D2") + "-" + day.ToString("D2"); //Ищем запись за вышеуказанный день WorkRecord record = null; foreach (WorkRecord r in records) { if (r.Date == dateStr) { record = r; break; } } if (record != null) { row.DayCodes[day - 1] = record.WorkCode; if (record.Hours > 0) { row.DayHours[day - 1] = record.Hours.ToString(); } if (workCodes.Contains(record.WorkCode)) { totalDays = totalDays + 1; totalHours = totalHours + (int)record.Hours; } } } row.TotalDays = totalDays; row.TotalHours = totalHours; timesheet.Rows.Add(row); } return timesheet; } } }