Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.50 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web.Mvc;
  5. using Castle.Core.Internal;
  6. using Kappa.Mvc.Exceptions;
  7. using OfficeOpenXml;
  8. using OfficeOpenXml.Style;
  9. using Uds.Common.ConfigEnums;
  10. using Uds.Common.Enums;
  11. using Uds.DataLayer.Entities.Auth;
  12. using Uds.DataLayer.Entities.Catalog.TrafficObjectTypes;
  13. using Uds.DataLayer.Entities.Catalog.TrafficViolationTypes;
  14. using Uds.DataLayer.Entities.Common;
  15. using Uds.DataLayer.Entities.Organizations;
  16. using Uds.DataLayer.Entities.RequestHistory;
  17. using Uds.DataLayer.Entities.Requests;
  18. using Uds.DataLayer.Entities.Violations;
  19. using Uds.Infrastructure.Access.Login;
  20. using Uds.Infrastructure.Access.Rights;
  21. using Uds.Infrastructure.Core.Formatters;
  22.  
  23. namespace Kotu.ManagerService.Models.Reports
  24. {
  25. public class ReportModelHandler : IReportModelHandler
  26. {
  27. private readonly IRequestRepository requestRepository;
  28. private readonly ITrafficObjectTypeRepository trafficObjectTypeRepository;
  29. private readonly IUserRepository userRepository;
  30. private readonly IPersonRepository personRepository;
  31. private readonly IRequestHistoryRepository requestHistoryRepository;
  32. private readonly IDateTimeTimestampFormatter dateTimeTimestampFormatter;
  33. private readonly IUserCredentialRepository userCredentialRepository;
  34. private readonly IRoleModuleLinkRepository roleModuleLinkRepository;
  35. private readonly IOrganizationRepository organizationRepository;
  36. private readonly ICurrentUserProvider currentUserProvider;
  37. private readonly ITrafficViolationTypeRepository trafficViolationTypeRepository;
  38. private readonly IEntityRightsChecker entityRightsChecker;
  39.  
  40. 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)
  41. {
  42. this.requestRepository = requestRepository;
  43. this.trafficObjectTypeRepository = trafficObjectTypeRepository;
  44. this.userRepository = userRepository;
  45. this.personRepository = personRepository;
  46. this.requestHistoryRepository = requestHistoryRepository;
  47. this.dateTimeTimestampFormatter = dateTimeTimestampFormatter;
  48. this.userCredentialRepository = userCredentialRepository;
  49. this.roleModuleLinkRepository = roleModuleLinkRepository;
  50. this.organizationRepository = organizationRepository;
  51. this.currentUserProvider = currentUserProvider;
  52. this.trafficViolationTypeRepository = trafficViolationTypeRepository;
  53. this.entityRightsChecker = entityRightsChecker;
  54. }
  55.  
  56.  
  57. public byte[] Handle(ReportForm form)
  58. {
  59. var organizationId = form.OrganizationId == Guid.Empty ? Guid.Empty : form.OrganizationId;
  60. var violationObjectType = form.TrafficViolationId == Guid.Empty ? Guid.Empty : form.TrafficViolationId;
  61. var trafficObjectType = form.TrafficObjectId == Guid.Empty ? Guid.Empty : form.TrafficObjectId;
  62.  
  63. var violationIds = BuildTrafficViolationIds();
  64. var trafficObjectIds = BuildTrafficObjectIds();
  65.  
  66. var organizationName = "Все организации";
  67.  
  68. var orgIds = organizationRepository.GetAll().Where(x =>
  69. x.OrganizationTypeId == OrganizationTypes.TrafficManagerCenter ||
  70. x.OrganizationTypeId == OrganizationTypes.Administration ||
  71. x.OrganizationTypeId == OrganizationTypes.Parks).Select(x => x.Id).ToList();
  72.  
  73. using (var excelPackage = new ExcelPackage())
  74. {
  75. var reportWoksheet = excelPackage.Workbook.Worksheets.Add("Отчёт");
  76.  
  77. var requests = requestRepository.GetAll().ToList();
  78.  
  79. if (organizationId != Guid.Empty)
  80. {
  81. requests = requests.Where(x => x.OrganizationId == organizationId).ToList();
  82. if (organizationId.HasValue)
  83. {
  84. var organization = organizationRepository.Find(organizationId.Value);
  85. organizationName = organization == null ? "Неизвестная организация" : organization.Title;
  86. }
  87. }
  88.  
  89. requests = violationObjectType != Guid.Empty
  90. ? requests.Where(x => x.ViolationTypeId == violationObjectType).ToList()
  91. : requests.Where(x => violationIds.Contains(x.ViolationTypeId)).ToList();
  92.  
  93. requests = trafficObjectType != Guid.Empty
  94. ? requests.Where(x => x.TrafficObjectTypeId == trafficObjectType).ToList()
  95. : requests.Where(x => trafficObjectIds.Contains(x.TrafficObjectTypeId)).ToList();
  96.  
  97.  
  98.  
  99.  
  100. var executedRequests = 0;
  101. var executedOnTime = 0;
  102. var executedOffTime = 0;
  103.  
  104. foreach (var item in requests)
  105. {
  106. var history = requestHistoryRepository.GetListByRequestId(item.Id).ToList();
  107. if (history.Any(x =>
  108. x.OperationId == KotuManagerServiceAppIds.Requests.SetBrigade.Guid &&
  109. x.OperationId == KotuManagerServiceAppIds.Requests.Close.Guid))
  110. {
  111. executedRequests++;
  112. var closeOp = history.FirstOrDefault(x => x.OperationId == KotuManagerServiceAppIds.Requests.Close.Guid);
  113.  
  114. if (closeOp != null && dateTimeTimestampFormatter.TimestampToDateTime(closeOp.Timestamp) <= item.EndDate)
  115. {
  116. executedOnTime++;
  117. }
  118. else
  119. {
  120. executedOffTime++;
  121. }
  122. }
  123. }
  124.  
  125.  
  126.  
  127. #region reportWorksheet
  128.  
  129. reportWoksheet.Cells["B1:G1"].Merge = true;
  130. reportWoksheet.Cells["B1:G1"].Style.Border.BorderAround(ExcelBorderStyle.Thin);
  131. reportWoksheet.Cells["A3"].Value = organizationName;
  132. reportWoksheet.Cells["A3"].Style.Border.BorderAround(ExcelBorderStyle.Thin);
  133. reportWoksheet.Cells["B2"].Value = "Количество поступивших заявок";
  134. reportWoksheet.Cells["B3"].Value = requests.Count(x => x.DateIssue >= form.BeginTime && x.DateIssue <= form.EndTime);
  135. reportWoksheet.Cells["C2"].Value = "Количество исполненных заявок";
  136. reportWoksheet.Cells["C3"].Value = executedRequests;
  137. reportWoksheet.Cells["D2"].Value = "Количество заявок, созданных ответственным специалистом";
  138. reportWoksheet.Cells["D3"].Value = requests.Count(x => x.DateIssue >= form.BeginTime && x.DateIssue <= form.EndTime && x.IsInternal);
  139. reportWoksheet.Cells["E2"].Value = "Количество заявок, находящихся в работе";
  140. reportWoksheet.Cells["E3"].Value = requests.Count(x => x.DateIssue >= form.BeginTime && x.DateIssue <= form.EndTime && x.StatusRequest == StatusRequest.InWork);
  141. reportWoksheet.Cells["F2"].Value = "Количество заявок, выполненных в срок";
  142. reportWoksheet.Cells["F3"].Value = executedOnTime;
  143. reportWoksheet.Cells["G2"].Value = "Количестов заявок с истекшим сроком ответа";
  144. reportWoksheet.Cells["G3"].Value = executedOffTime;
  145.  
  146. var roles = roleModuleLinkRepository.GetByModuleIds(new List<Guid>() {Modules.ManagerService}).Where(x => x.RoleId != UserRoles.SuperAdmin).Select(x => x.RoleId).ToList();
  147.  
  148. var userIds = new List<Guid>();
  149.  
  150. if (organizationId == Guid.Empty)
  151. {
  152. userIds = userCredentialRepository.GetByOrganizationListAndRoleIds(orgIds, roles).Select(x => x.UserId).ToList();
  153. }
  154. else
  155. {
  156. if (organizationId.HasValue)
  157. userIds = userCredentialRepository.GetByOrganizationAndRoleIds(organizationId.Value, roles)
  158. .Select(x => x.UserId).ToList();
  159. }
  160.  
  161. var users = userRepository.GetByIds(userIds);
  162.  
  163. var historiesByUsers = requestHistoryRepository.GetListByUsersIds(userIds);
  164.  
  165. var personIds = userRepository.GetByIds(userIds).Select(x => x.Value.PersonId).ToList();
  166.  
  167. var persons = personRepository.GetByIds(personIds).ToList();
  168.  
  169. var personRow = 4;
  170. var fio = "Неизвестно";
  171. foreach (var user in users)
  172. {
  173. var person = persons.FirstOrDefault(x => x.Key == user.Value.PersonId);
  174. if (person.Value != null) fio = person.Value.LastName + " " + person.Value.FirstName + " " + person.Value.SurName;
  175.  
  176. reportWoksheet.Cells[personRow, 1].Value = fio;
  177. reportWoksheet.Cells[personRow, 1, personRow, 7].Style.Border.Top.Style = ExcelBorderStyle.Thin;
  178. reportWoksheet.Cells[personRow, 1, personRow, 7].Style.Border.Right.Style = ExcelBorderStyle.Thin;
  179. reportWoksheet.Cells[personRow, 1, personRow, 7].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
  180. reportWoksheet.Cells[personRow, 1, personRow, 7].Style.Border.Left.Style = ExcelBorderStyle.Thin;
  181.  
  182.  
  183. // количество поступивших заявок оператору
  184. var setBrigadeOpByUser = historiesByUsers.Where(x =>
  185. x.AuthorId == user.Key && x.OperationId == KotuManagerServiceAppIds.Requests.SetBrigade.Guid)
  186. .ToList();
  187.  
  188. var setBrigadeRequestsCount = setBrigadeOpByUser.Count;
  189.  
  190. reportWoksheet.Cells[personRow, 2].Value = setBrigadeRequestsCount;
  191.  
  192. // количество исполненных заявок оператором
  193.  
  194. var closeOpByUser = historiesByUsers.Where(x =>
  195. x.AuthorId == user.Key &&
  196. x.OperationId == KotuManagerServiceAppIds.Requests.Close.Guid &&
  197. dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) >= form.BeginTime &&
  198. dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) <= form.EndTime).ToList();
  199.  
  200. var closeRequestsCount = closeOpByUser.Count;
  201.  
  202. reportWoksheet.Cells[personRow, 3].Value = closeRequestsCount;
  203.  
  204. // количество заявок созданных оператором
  205.  
  206. var createOpByUser = historiesByUsers.Where(x =>
  207. x.AuthorId == user.Key && x.OperationId == KotuManagerServiceAppIds.Requests.Create.Guid &&
  208. dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) >= form.BeginTime &&
  209. dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) <= form.EndTime).ToList();
  210.  
  211. var createRequestsCount = createOpByUser.Count;
  212.  
  213. reportWoksheet.Cells[personRow, 4].Value = createRequestsCount;
  214.  
  215. // количество заявок в работе
  216.  
  217. var inWorkHistoryByUser = historiesByUsers.Where(x =>
  218. x.AuthorId == user.Key &&
  219. dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) >= form.BeginTime &&
  220. dateTimeTimestampFormatter.TimestampToDateTime(x.Timestamp) <= form.EndTime)
  221. .Select(x => x.RequestId).ToList();
  222.  
  223. var requestsInWork = requests.Where(x =>
  224. inWorkHistoryByUser.Contains(x.Id) &&
  225. (x.StatusRequest == StatusRequest.InWork || x.StatusRequest == StatusRequest.InBrigadeWork))
  226. .ToList();
  227.  
  228. var inWorkRequestsCount = requestsInWork.Count;
  229.  
  230. reportWoksheet.Cells[personRow, 5].Value = inWorkRequestsCount;
  231.  
  232. // количество заявок в срок
  233.  
  234. var executedRequestInTimeByUser = 0;
  235. var executedRequestOutOfTimeByUser = 0;
  236.  
  237. foreach (var requestHistory in closeOpByUser)
  238. {
  239. var closedRequest = requests.FirstOrDefault(x => x.Id == requestHistory.RequestId);
  240.  
  241. if(closedRequest == null) continue;
  242.  
  243. if (requestHistory != null && dateTimeTimestampFormatter.TimestampToDateTime(requestHistory.Timestamp) <= closedRequest.EndDate)
  244. {
  245. executedRequestInTimeByUser++;
  246. } else if (requestHistory != null && dateTimeTimestampFormatter.TimestampToDateTime(requestHistory.Timestamp) > closedRequest.EndDate)
  247. {
  248. executedRequestOutOfTimeByUser++;
  249. }
  250. }
  251.  
  252. reportWoksheet.Cells[personRow, 6].Value = executedRequestInTimeByUser;
  253.  
  254. // количество заявок не в срок
  255.  
  256. reportWoksheet.Cells[personRow, 7].Value = executedRequestOutOfTimeByUser;
  257.  
  258.  
  259. reportWoksheet.Row(personRow).Style.Font.Size = 14;
  260. reportWoksheet.Row(personRow).Style.Font.Name = "Times New Roman";
  261. personRow++;
  262. }
  263.  
  264. for (var i = 2; i <= 7; i++)
  265. {
  266. reportWoksheet.Column(i).Width = 23.43;
  267. }
  268.  
  269. reportWoksheet.Column(1).Width = 38.86;
  270. reportWoksheet.Cells["B2:G3"].Style.Border.Top.Style = ExcelBorderStyle.Thin;
  271. reportWoksheet.Cells["B2:G3"].Style.Border.Right.Style = ExcelBorderStyle.Thin;
  272. reportWoksheet.Cells["B2:G3"].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
  273. reportWoksheet.Cells["B2:G3"].Style.Border.Left.Style = ExcelBorderStyle.Thin;
  274. reportWoksheet.Cells["A1:G3"].Style.Font.Size = 14;
  275. reportWoksheet.Cells["A1:G3"].Style.Font.Name = "Times New Roman";
  276. reportWoksheet.Row(2).Style.WrapText = true;
  277. reportWoksheet.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
  278. reportWoksheet.Row(2).Style.VerticalAlignment = ExcelVerticalAlignment.Top;
  279. reportWoksheet.Row(2).Height = 187.5;
  280.  
  281. #endregion
  282.  
  283.  
  284. return excelPackage.GetAsByteArray();
  285. }
  286. }
  287.  
  288. private IList<Guid> BuildTrafficObjectIds()
  289. {
  290. var highestRights = entityRightsChecker.GetHighestRights(Modules.ManagerService, Entities.KotuReports,
  291. KotuManagerServiceAppIds.KotuReports.Download.Guid);
  292.  
  293. var violations = trafficViolationTypeRepository.GetAll().ToList();
  294.  
  295. var organizationId = currentUserProvider.Current.Authorization.OrganizationId;
  296.  
  297. var organization = organizationRepository.Find(organizationId);
  298.  
  299. if (organization == null) throw new ForbiddenException("У вас нет доступа");
  300.  
  301. if (highestRights.Value == Rules.AllOrganizations.Guid)
  302. {
  303. }
  304. else
  305. {
  306. violations = violations.Where(x => x.OrganizationId == organization.OrganizationTypeId).ToList();
  307. }
  308.  
  309. var violationsObjectIds = violations.Select(x => x.ObjectTypeId).ToList();
  310.  
  311. var traffics = trafficObjectTypeRepository.GetAll().Where(x => violationsObjectIds.Contains(x.Id)).ToList();
  312.  
  313. return traffics.Select(x => x.Id).ToList();
  314. }
  315.  
  316. private IList<Guid> BuildTrafficViolationIds()
  317. {
  318. var highestRights = entityRightsChecker.GetHighestRights(Modules.ManagerService, Entities.KotuReports,
  319. KotuManagerServiceAppIds.KotuReports.Download.Guid);
  320.  
  321. var violations = trafficViolationTypeRepository.GetAll().ToList();
  322.  
  323. var organizationId = currentUserProvider.Current.Authorization.OrganizationId;
  324.  
  325. var organization = organizationRepository.Find(organizationId);
  326.  
  327. if (organization == null) throw new ForbiddenException("У вас нет доступа");
  328.  
  329. if (highestRights.Value == Rules.AllOrganizations.Guid)
  330. {
  331. }
  332. else
  333. {
  334. violations = violations.Where(x => x.OrganizationId == organization.OrganizationTypeId).ToList();
  335. }
  336.  
  337. return violations.Select(x => x.Id).ToList();
  338. }
  339. }
  340. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement