diff --git a/Hospital/HospitalRestApi/Controllers/ReportController.cs b/Hospital/HospitalRestApi/Controllers/ReportController.cs new file mode 100644 index 0000000..0cdeb79 --- /dev/null +++ b/Hospital/HospitalRestApi/Controllers/ReportController.cs @@ -0,0 +1,87 @@ +using HospitalContracts.BindingModels; +using HospitalContracts.BusinessLogicContracts; +using HospitalContracts.ViewModels; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.IO; + +namespace HospitalRestApi.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + [ApiExplorerSettings(IgnoreApi = true)] + public class ReportController : ControllerBase + { + private readonly ILogger _logger; + private readonly IReportLogic _logic; + + public ReportController(ILogger logger, IReportLogic logic) + { + _logger = logger; + _logic = logic; + } + + [HttpPost] + public ActionResult GetReportPatientsToExcelFile(ReportBindingModel model) + { + try + { + var stream = _logic.SavePatientsToExcelFile(model); + return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", model.FileName); + + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка пациентов"); + throw; + } + } + + [HttpPost] + public ActionResult GetReportPatientsToWordFile(ReportBindingModel model) + { + try + { + var stream = _logic.SavePatientsToWordFile(model); + return File(stream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", model.FileName); + + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка пациентов"); + throw; + } + } + + [HttpGet] + public List GetReportPrescriptions(DateTime startDate, DateTime endDate) + { + try + { + return _logic.GetPrescriptionProcedures(new ReportBindingModel { DateFrom = startDate, DateTo = endDate}); + + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка пациентов"); + throw; + } + } + [HttpPost] + public ActionResult GetReportPrescriptionsPdf(DateTime startDate, DateTime endDate, ReportBindingModel model) + { + try + { + var stream = _logic.SavePrescriptionsToPdfFile(model); + return File(stream, "application/pdf", "pdf.pdf"); + + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения списка пациентов"); + throw; + } + } + + } +} diff --git a/Hospital/HospitalRestApi/Program.cs b/Hospital/HospitalRestApi/Program.cs index 6d976d8..274fc68 100644 --- a/Hospital/HospitalRestApi/Program.cs +++ b/Hospital/HospitalRestApi/Program.cs @@ -1,4 +1,6 @@ using HospitalBusinessLogic; +using HospitalBusinessLogic.OfficePackage; +using HospitalBusinessLogic.OfficePackage.Implements; using HospitalContracts.BusinessLogicContracts; using HospitalContracts.StorageContracts; using HospitalDatabaseImplement.Implements; @@ -26,8 +28,9 @@ builder.Services.AddTransient(); builder.Services.AddTransient(); -//builder.Services.AddTransient(); -//builder.Services.AddTransient(); +builder.Services.AddTransient(); +builder.Services.AddTransient(); +builder.Services.AddTransient(); //builder.Services.AddSingleton(); builder.Services.AddControllers().AddJsonOptions((option) => diff --git a/Hospital/HospitalWeb/APIClient.cs b/Hospital/HospitalWeb/APIClient.cs index c19ace9..43bc143 100644 --- a/Hospital/HospitalWeb/APIClient.cs +++ b/Hospital/HospitalWeb/APIClient.cs @@ -41,5 +41,24 @@ namespace HospitalWeb throw new Exception(result); } } + + public static (Stream stream, string? contentType)? GetFileRequest(string requestUrl, T model) + { + var json = JsonConvert.SerializeObject(model); + var data = new StringContent(json, Encoding.UTF8, "application/json"); + var response = _client.PostAsync(requestUrl, data); + + var result = response.Result.Content.ReadAsStreamAsync().Result; + response.Result.Content.Headers.TryGetValues("content-type", out var type); + if (response.Result.IsSuccessStatusCode) + { + return (stream: result, contentType: type?.First()); + } + + else + { + throw new Exception($"Failed to retrieve file from {requestUrl}. StatusCode: {response.Result.StatusCode}"); + } + } } } diff --git a/Hospital/HospitalWeb/Controllers/RecipeController.cs b/Hospital/HospitalWeb/Controllers/RecipeController.cs index 1d4624b..30bd07c 100644 --- a/Hospital/HospitalWeb/Controllers/RecipeController.cs +++ b/Hospital/HospitalWeb/Controllers/RecipeController.cs @@ -51,8 +51,6 @@ namespace HospitalWeb.Controllers model.ApothecaryId = APIClient.Apothecary.Id; if (model.Id != 0) { - // тут надо вытащить ключи, потом по ним сделать массовый запрос сущностей лекарств, а потом вставить как значения в словарь - //model.RecipeMedicines = APIClient.PostRequest("api/recipe/update", model); } else diff --git a/Hospital/HospitalWeb/Controllers/ReportController.cs b/Hospital/HospitalWeb/Controllers/ReportController.cs new file mode 100644 index 0000000..37e6186 --- /dev/null +++ b/Hospital/HospitalWeb/Controllers/ReportController.cs @@ -0,0 +1,62 @@ +using HospitalContracts.BindingModels; +using HospitalContracts.ViewModels; +using HospitalWeb.HelpModels; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Net; + +namespace HospitalWeb.Controllers +{ + public class ReportController : Controller + { + + [HttpGet("/reports/patients")] + public IActionResult ReportPatients() + { + ViewBag.Medicines = APIClient.GetRequest>($"api/medicine/getmedicines"); + return View(); + } + + [HttpGet("/reports/precriptions")] + public IActionResult ReportPrescriptions(List? report) + { + return View(report); + } + + [HttpGet("/report/getprescriptions")] + public IActionResult GetPrescriptions(DateTime startDate, DateTime endDate, string type) + { + /* // если type - получение отчета на форме + // Преобразуем даты к нужному формату + string startDateString = startDate.ToString("yyyy-MM-dd HH:mm:ss.fffffff"); + string endDateString = endDate.ToString("yyyy-MM-dd HH:mm:ss.fffffff"); + var report = APIClient.GetRequest>($"api/report/getreportprescriptions?startDate={startDateString}&endDate={endDateString}"); + return View("ReportPrescriptions", report);*/ + // иначе отправка на почту + string startDateString = startDate.ToString("yyyy-MM-dd HH:mm:ss.fffffff"); + string endDateString = endDate.ToString("yyyy-MM-dd HH:mm:ss.fffffff"); + var fileData = APIClient.GetFileRequest($"api/report/getreportprescriptionspdf?", new ReportBindingModel { DateFrom = startDate, DateTo = endDate }); + if (fileData != null) + return File(fileData.Value.stream, fileData.Value.contentType!, "prescriptions.pdf"); + throw new Exception($"Failed to retrieve file from."); + } + + [HttpGet("/reports/download")] + public IActionResult DownloadReport(ReportBindingModel model, string Format) + { + var format = Enum.Parse(Format); + var (endpoint, extension) = format switch + { + FileFormat.Word => ("api/report/getreportpatientstowordfile/", ".docx"), + FileFormat.Excel => ("api/report/getreportpatientstoexcelfile/", ".xlsx"), + _ => throw new ArgumentException($"Invalid file format: {format}", nameof(Format)) + }; + model.FileName += extension; + var fileData = APIClient.GetFileRequest(endpoint, model); + if (fileData != null) + return File(fileData.Value.stream, fileData.Value.contentType!, model.FileName); + throw new Exception($"Failed to retrieve file from {endpoint}."); + } + } +} diff --git a/Hospital/HospitalWeb/HelpModels/FileFormat.cs b/Hospital/HospitalWeb/HelpModels/FileFormat.cs new file mode 100644 index 0000000..bdce4b0 --- /dev/null +++ b/Hospital/HospitalWeb/HelpModels/FileFormat.cs @@ -0,0 +1,8 @@ +namespace HospitalWeb.HelpModels +{ + public enum FileFormat + { + Word = 0, + Excel = 1 + } +} diff --git a/Hospital/HospitalWeb/Views/Report/ReportPatients.cshtml b/Hospital/HospitalWeb/Views/Report/ReportPatients.cshtml new file mode 100644 index 0000000..ffb4fc2 --- /dev/null +++ b/Hospital/HospitalWeb/Views/Report/ReportPatients.cshtml @@ -0,0 +1,34 @@ +@using HospitalContracts.ViewModels; +@using System.Globalization +@model MedicineViewModel +@{ + ViewData["Title"] = "Отчет Пациенты"; +} + +
+

@ViewData["Title"]

+
+
+
+
Выбор лекарств
+
+ + Для выбора нескольких элементов удерживайте клавишу Ctrl. +
+
+
+
Название файла (без формата):
+
+
+
+
Формат файла:
+
+ +
+
+ +
+ diff --git a/Hospital/HospitalWeb/Views/Report/ReportPrescriptions.cshtml b/Hospital/HospitalWeb/Views/Report/ReportPrescriptions.cshtml new file mode 100644 index 0000000..b8ff787 --- /dev/null +++ b/Hospital/HospitalWeb/Views/Report/ReportPrescriptions.cshtml @@ -0,0 +1,51 @@ +@using HospitalContracts.ViewModels; +@model List + +@{ + ViewData["Title"] = "Отчет Поступления"; +} + +
+

@ViewData["Title"]

+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+@if (Model != null && Model.Any()) +{ + + + + + + + + + + + @foreach (var report in Model) + { + + + + + + + } + +
Дата поступленияЛекарствоКоличествоНазвание процедуры
@report.DateCreate.ToShortDateString()@report.MedicineName@report.Number@report.ProcedureName
+} \ No newline at end of file diff --git a/Hospital/HospitalWeb/Views/Shared/_Layout.cshtml b/Hospital/HospitalWeb/Views/Shared/_Layout.cshtml index 01d7c15..e4da1da 100644 --- a/Hospital/HospitalWeb/Views/Shared/_Layout.cshtml +++ b/Hospital/HospitalWeb/Views/Shared/_Layout.cshtml @@ -28,6 +28,15 @@ +