Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web.Mvc;
- using Castle.Core.Internal;
- using Kappa.Mvc.Exceptions;
- using OfficeOpenXml;
- using OfficeOpenXml.Style;
- using Uds.Common.ConfigEnums;
- using Uds.Common.Enums;
- using Uds.DataLayer.Entities.Auth;
- using Uds.DataLayer.Entities.Catalog.TrafficObjectTypes;
- using Uds.DataLayer.Entities.Catalog.TrafficViolationTypes;
- using Uds.DataLayer.Entities.Common;
- using Uds.DataLayer.Entities.Organizations;
- using Uds.DataLayer.Entities.RequestHistory;
- using Uds.DataLayer.Entities.Requests;
- using Uds.DataLayer.Entities.Violations;
- using Uds.Infrastructure.Access.Login;
- using Uds.Infrastructure.Access.Rights;
- using Uds.Infrastructure.Core.Formatters;
- namespace Kotu.ManagerService.Models.Reports
- {
- public class ReportModelHandler : IReportModelHandler
- {
- private readonly IRequestRepository requestRepository;
- private readonly ITrafficObjectTypeRepository trafficObjectTypeRepository;
- private readonly IUserRepository userRepository;
- private readonly IPersonRepository personRepository;
- private readonly IRequestHistoryRepository requestHistoryRepository;
- private readonly IDateTimeTimestampFormatter dateTimeTimestampFormatter;
- private readonly IUserCredentialRepository userCredentialRepository;
- private readonly IRoleModuleLinkRepository roleModuleLinkRepository;
- private readonly IOrganizationRepository organizationRepository;
- private readonly ICurrentUserProvider currentUserProvider;
- private readonly ITrafficViolationTypeRepository trafficViolationTypeRepository;
- private readonly IEntityRightsChecker entityRightsChecker;
- public ReportModelHandler(IRequestRepository requestRepository, ITrafficObjectTypeRepository trafficObjectTypeRepository, IUserRepository userRepository, IPersonRepository personRepository, IRequestHistoryRepository requestHistoryRepository, IDateTimeTimestampFormatter dateTimeTimestampFormatter, IUserCredentialRepository userCredentialRepository, IRoleModuleLinkRepository roleModuleLinkRepository, IOrganizationRepository organizationRepository, ICurrentUserProvider currentUserProvider, ITrafficViolationTypeRepository trafficViolationTypeRepository, IEntityRightsChecker entityRightsChecker)
- {
- this.requestRepository = requestRepository;
- this.trafficObjectTypeRepository = trafficObjectTypeRepository;
- this.userRepository = userRepository;
- this.personRepository = personRepository;
- this.requestHistoryRepository = requestHistoryRepository;
- this.dateTimeTimestampFormatter = dateTimeTimestampFormatter;
- this.userCredentialRepository = userCredentialRepository;
- this.roleModuleLinkRepository = roleModuleLinkRepository;
- this.organizationRepository = organizationRepository;
- this.currentUserProvider = currentUserProvider;
- this.trafficViolationTypeRepository = trafficViolationTypeRepository;
- this.entityRightsChecker = entityRightsChecker;
- }
- public byte[] Handle(ReportForm form)
- {
- var organizationId = form.OrganizationId == Guid.Empty ? Guid.Empty : form.OrganizationId;
- var violationObjectType = form.TrafficViolationId == Guid.Empty ? Guid.Empty : form.TrafficViolationId;
- var trafficObjectType = form.TrafficObjectId == Guid.Empty ? Guid.Empty : form.TrafficObjectId;
- var violationIds = BuildTrafficViolationIds();
- var trafficObjectIds = BuildTrafficObjectIds();
- var organizationName = "Все организации";
- var orgIds = organizationRepository.GetAll().Where(x =>
- x.OrganizationTypeId == OrganizationTypes.TrafficManagerCenter ||
- x.OrganizationTypeId == OrganizationTypes.Administration ||
- x.OrganizationTypeId == OrganizationTypes.Parks).Select(x => x.Id).ToList();
- using (var excelPackage = new ExcelPackage())
- {
- var reportWoksheet = excelPackage.Workbook.Worksheets.Add("Отчёт");
- var requests = requestRepository.GetAll().ToList();
- if (organizationId != Guid.Empty)
- {
- requests = requests.Where(x => x.OrganizationId == organizationId).ToList();
- if (organizationId.HasValue)
- {
- var organization = organizationRepository.Find(organizationId.Value);
- organizationName = organization == null ? "Неизвестная организация" : organization.Title;
- }
- }
- requests = violationObjectType != Guid.Empty
- ? requests.Where(x => x.ViolationTypeId == violationObjectType).ToList()
- : requests.Where(x => violationIds.Contains(x.ViolationTypeId)).ToList();
- requests = trafficObjectType != Guid.Empty
- ? requests.Where(x => x.TrafficObjectTypeId == trafficObjectType).ToList()
- : requests.Where(x => trafficObjectIds.Contains(x.TrafficObjectTypeId)).ToList();
- var executedRequests = 0;
- var executedOnTime = 0;
- var executedOffTime = 0;
- foreach (var item in requests)
- {
- var history = requestHistoryRepository.GetListByRequestId(item.Id).ToList();
- if (history.Any(x =>
- x.OperationId == KotuManagerServiceAppIds.Requests.SetBrigade.Guid &&
- x.OperationId == KotuManagerServiceAppIds.Requests.Close.Guid))
- {
- executedRequests++;
- var closeOp = history.FirstOrDefault(x => x.OperationId == KotuManagerServiceAppIds.Requests.Close.Guid);
- if (closeOp != null && dateTimeTimestampFormatter.TimestampToDateTime(closeOp.Timestamp) <= item.EndDate)
- {
- executedOnTime++;
- }
- else
- {
- executedOffTime++;
- }
- }
- }
- #region reportWorksheet
- reportWoksheet.Cells["B1:G1"].Merge = true;
- reportWoksheet.Cells["B1:G1"].Style.Border.BorderAround(ExcelBorderStyle.Thin);
- reportWoksheet.Cells["A3"].Value = organizationName;
- reportWoksheet.Cells["A3"].Style.Border.BorderAround(ExcelBorderStyle.Thin);
- reportWoksheet.Cells["B2"].Value = "Количество поступивших заявок";
- reportWoksheet.Cells["B3"].Value = requests.Count(x => x.DateIssue >= form.BeginTime && x.DateIssue <= form.EndTime);
- reportWoksheet.Cells["C2"].Value = "Количество исполненных заявок";
- reportWoksheet.Cells["C3"].Value = executedRequests;
- reportWoksheet.Cells["D2"].Value = "Количество заявок, созданных ответственным специалистом";
- reportWoksheet.Cells["D3"].Value = requests.Count(x => x.DateIssue >= form.BeginTime && x.DateIssue <= form.EndTime && x.IsInternal);
- reportWoksheet.Cells["E2"].Value = "Количество заявок, находящихся в работе";
- reportWoksheet.Cells["E3"].Value = requests.Count(x => x.DateIssue >= form.BeginTime && x.DateIssue <= form.EndTime && x.StatusRequest == StatusRequest.InWork);
- reportWoksheet.Cells["F2"].Value = "Количество заявок, выполненных в срок";
- reportWoksheet.Cells["F3"].Value = executedOnTime;
- reportWoksheet.Cells["G2"].Value = "Количестов заявок с истекшим сроком ответа";
- reportWoksheet.Cells["G3"].Value = executedOffTime;
- var roles = roleModuleLinkRepository.GetByModuleIds(new List<Guid>() {Modules.ManagerService}).Where(x => x.RoleId != UserRoles.SuperAdmin).Select(x => x.RoleId).ToList();
- var userIds = new List<Guid>();
- if (organizationId == Guid.Empty)
- {
- userIds = userCredentialRepository.GetByOrganizationListAndRoleIds(orgIds, roles).Select(x => x.UserId).ToList();
- }
- else
- {
- if (organizationId.HasValue)
- userIds = userCredentialRepository.GetByOrganizationAndRoleIds(organizationId.Value, roles)
- .Select(x => x.UserId).ToList();
- }
- var users = userRepository.GetByIds(userIds);
- var historiesByUsers = requestHistoryRepository.GetListByUsersIds(userIds);
- var personIds = userRepository.GetByIds(userIds).Select(x => x.Value.PersonId).ToList();
- var persons = personRepository.GetByIds(personIds).ToList();
- var personRow = 4;
- var fio = "Неизвестно";
- foreach (var user in users)
- {
- var person = persons.FirstOrDefault(x => x.Key == user.Value.PersonId);
- if (person.Value != null) fio = person.Value.LastName + " " + person.Value.FirstName + " " + person.Value.SurName;
- reportWoksheet.Cells[personRow, 1].Value = fio;
- reportWoksheet.Cells[personRow, 1, personRow, 7].Style.Border.Top.Style = ExcelBorderStyle.Thin;
- reportWoksheet.Cells[personRow, 1, personRow, 7].Style.Border.Right.Style = ExcelBorderStyle.Thin;
- reportWoksheet.Cells[personRow, 1, personRow, 7].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
- reportWoksheet.Cells[personRow, 1, personRow, 7].Style.Border.Left.Style = ExcelBorderStyle.Thin;
- // количество поступивших заявок оператору
- var setBrigadeOpByUser = historiesByUsers.Where(x =>
- x.AuthorId == user.Key && x.OperationId == KotuManagerServiceAppIds.Requests.SetBrigade.Guid)
- .ToList();
- var setBrigadeRequestsCount = setBrigadeOpByUser.Count;
- reportWoksheet.Cells[personRow, 2].Value = setBrigadeRequestsCount;
- // количество исполненных заявок оператором
- var closeOpByUser = historiesByUsers.Where(x =>
- x.AuthorId == user.Key &&
- x.OperationId == KotuManagerServiceAppIds.Requests.Close.Guid &&
- dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) >= form.BeginTime &&
- dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) <= form.EndTime).ToList();
- var closeRequestsCount = closeOpByUser.Count;
- reportWoksheet.Cells[personRow, 3].Value = closeRequestsCount;
- // количество заявок созданных оператором
- var createOpByUser = historiesByUsers.Where(x =>
- x.AuthorId == user.Key && x.OperationId == KotuManagerServiceAppIds.Requests.Create.Guid &&
- dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) >= form.BeginTime &&
- dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) <= form.EndTime).ToList();
- var createRequestsCount = createOpByUser.Count;
- reportWoksheet.Cells[personRow, 4].Value = createRequestsCount;
- // количество заявок в работе
- var inWorkHistoryByUser = historiesByUsers.Where(x =>
- x.AuthorId == user.Key &&
- dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) >= form.BeginTime &&
- dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) <= form.EndTime)
- .Select(x => x.RequestId).ToList();
- var requestsInWork = requests.Where(x =>
- inWorkHistoryByUser.Contains(x.Id) &&
- (x.StatusRequest == StatusRequest.InWork || x.StatusRequest == StatusRequest.InBrigadeWork))
- .ToList();
- var inWorkRequestsCount = requestsInWork.Count;
- reportWoksheet.Cells[personRow, 5].Value = inWorkRequestsCount;
- // количество заявок в срок
- var executedRequestInTimeByUser = 0;
- var executedRequestOutOfTimeByUser = 0;
- foreach (var requestHistory in closeOpByUser)
- {
- var closedRequest = requests.FirstOrDefault(x => x.Id == requestHistory.RequestId);
- if(closedRequest == null) continue;
- if (requestHistory != null && dateTimeTimestampFormatter.TimestampToDateTime(requestHistory.Timestamp) <= closedRequest.EndDate)
- {
- executedRequestInTimeByUser++;
- } else if (requestHistory != null && dateTimeTimestampFormatter.TimestampToDateTime(requestHistory.Timestamp) > closedRequest.EndDate)
- {
- executedRequestOutOfTimeByUser++;
- }
- }
- reportWoksheet.Cells[personRow, 6].Value = executedRequestInTimeByUser;
- // количество заявок не в срок
- reportWoksheet.Cells[personRow, 7].Value = executedRequestOutOfTimeByUser;
- reportWoksheet.Row(personRow).Style.Font.Size = 14;
- reportWoksheet.Row(personRow).Style.Font.Name = "Times New Roman";
- personRow++;
- }
- for (var i = 2; i <= 7; i++)
- {
- reportWoksheet.Column(i).Width = 23.43;
- }
- reportWoksheet.Column(1).Width = 38.86;
- reportWoksheet.Cells["B2:G3"].Style.Border.Top.Style = ExcelBorderStyle.Thin;
- reportWoksheet.Cells["B2:G3"].Style.Border.Right.Style = ExcelBorderStyle.Thin;
- reportWoksheet.Cells["B2:G3"].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
- reportWoksheet.Cells["B2:G3"].Style.Border.Left.Style = ExcelBorderStyle.Thin;
- reportWoksheet.Cells["A1:G3"].Style.Font.Size = 14;
- reportWoksheet.Cells["A1:G3"].Style.Font.Name = "Times New Roman";
- reportWoksheet.Row(2).Style.WrapText = true;
- reportWoksheet.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
- reportWoksheet.Row(2).Style.VerticalAlignment = ExcelVerticalAlignment.Top;
- reportWoksheet.Row(2).Height = 187.5;
- #endregion
- return excelPackage.GetAsByteArray();
- }
- }
- private IList<Guid> BuildTrafficObjectIds()
- {
- var highestRights = entityRightsChecker.GetHighestRights(Modules.ManagerService, Entities.KotuReports,
- KotuManagerServiceAppIds.KotuReports.Download.Guid);
- var violations = trafficViolationTypeRepository.GetAll().ToList();
- var organizationId = currentUserProvider.Current.Authorization.OrganizationId;
- var organization = organizationRepository.Find(organizationId);
- if (organization == null) throw new ForbiddenException("У вас нет доступа");
- if (highestRights.Value == Rules.AllOrganizations.Guid)
- {
- }
- else
- {
- violations = violations.Where(x => x.OrganizationId == organization.OrganizationTypeId).ToList();
- }
- var violationsObjectIds = violations.Select(x => x.ObjectTypeId).ToList();
- var traffics = trafficObjectTypeRepository.GetAll().Where(x => violationsObjectIds.Contains(x.Id)).ToList();
- return traffics.Select(x => x.Id).ToList();
- }
- private IList<Guid> BuildTrafficViolationIds()
- {
- var highestRights = entityRightsChecker.GetHighestRights(Modules.ManagerService, Entities.KotuReports,
- KotuManagerServiceAppIds.KotuReports.Download.Guid);
- var violations = trafficViolationTypeRepository.GetAll().ToList();
- var organizationId = currentUserProvider.Current.Authorization.OrganizationId;
- var organization = organizationRepository.Find(organizationId);
- if (organization == null) throw new ForbiddenException("У вас нет доступа");
- if (highestRights.Value == Rules.AllOrganizations.Guid)
- {
- }
- else
- {
- violations = violations.Where(x => x.OrganizationId == organization.OrganizationTypeId).ToList();
- }
- return violations.Select(x => x.Id).ToList();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement