Этап 4. Бизнес-логика с отчетами
This commit is contained in:
parent
d9c9cf410a
commit
c34baa609e
95
Hospital/HospitalBusinessLogic/ReportLogic.cs
Normal file
95
Hospital/HospitalBusinessLogic/ReportLogic.cs
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
using HospitalContracts.BindingModels;
|
||||||
|
using HospitalContracts.BusinessLogicContracts;
|
||||||
|
using HospitalContracts.SearchModels;
|
||||||
|
using HospitalContracts.StorageContracts;
|
||||||
|
using HospitalContracts.ViewModels;
|
||||||
|
|
||||||
|
namespace HospitalBusinessLogic
|
||||||
|
{
|
||||||
|
public class ReportLogic : IReportLogic
|
||||||
|
{
|
||||||
|
private readonly IMedicineStorage _medicineStorage;
|
||||||
|
private readonly IPatientStorage _patientStorage;
|
||||||
|
private readonly ITreatmentStorage _treatmentStorage;
|
||||||
|
private readonly IPrescriptionStorage _prescriptionStorage;
|
||||||
|
private readonly IProcedureStorage _procedureStorage;
|
||||||
|
private readonly IRecipeStorage _recipeStorage;
|
||||||
|
|
||||||
|
public ReportLogic(IMedicineStorage medicineStorage, IPatientStorage patientStorage,
|
||||||
|
IPrescriptionStorage prescriptionStorage, ITreatmentStorage treatmentStorage, IProcedureStorage procedureStorage, IRecipeStorage recipeStorage)
|
||||||
|
{
|
||||||
|
_medicineStorage = medicineStorage;
|
||||||
|
_patientStorage = patientStorage;
|
||||||
|
_prescriptionStorage = prescriptionStorage;
|
||||||
|
_treatmentStorage = treatmentStorage;
|
||||||
|
_procedureStorage = procedureStorage;
|
||||||
|
_recipeStorage = recipeStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReportPatientsMedicinesViewModel GetMedicinePatients(ReportBindingModel model)
|
||||||
|
{
|
||||||
|
if (!model.MedicineId.HasValue)
|
||||||
|
{
|
||||||
|
return new();
|
||||||
|
}
|
||||||
|
var medicine = _medicineStorage.GetElement(new MedicineSearchModel { Id = model.MedicineId});
|
||||||
|
if (medicine == null)
|
||||||
|
{
|
||||||
|
return new();
|
||||||
|
}
|
||||||
|
// получаем рецепты и процедуры, в которых используется лекарство
|
||||||
|
var treatmentsInRecipes = _recipeStorage.GetFullList().Where(x => x.RecipeMedicines.ContainsKey(medicine.Id)).SelectMany(x => x.RecipeTreatments.Keys).Distinct();
|
||||||
|
var procedures = _procedureStorage.GetFullList().Where(x => x.ProcedureMedicines.ContainsKey(medicine.Id)).Select(x => x.Id);
|
||||||
|
// пациенты могут получать лекарство как через процедуры, так и через рецепты, поэтому объединим оба варианта
|
||||||
|
var treatments = _treatmentStorage.GetFullList().Where(x => (x.TreatmentProcedures.Keys.Intersect(procedures).Any() || treatmentsInRecipes.Contains(x.Id))).Select(x => x.Id);
|
||||||
|
|
||||||
|
// получаем список пациентов, которые связаны с найденными лечениями
|
||||||
|
var patients = _patientStorage.GetFullList().Where(x => treatments.Contains(x.TreatmentId));
|
||||||
|
|
||||||
|
var record = new ReportPatientsMedicinesViewModel
|
||||||
|
{
|
||||||
|
MedicineName = medicine.Name,
|
||||||
|
Patients = new List<string>()
|
||||||
|
};
|
||||||
|
foreach (var patient in patients)
|
||||||
|
{
|
||||||
|
record.Patients.Add($"{patient.Surname} {patient.Name} {patient.Patronymic} {patient.BirthDate}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ReportPrescriptionProcedureViewModel> GetPrescriptionProcedures(ReportBindingModel model)
|
||||||
|
{
|
||||||
|
var prescriptions = _prescriptionStorage.GetFilteredList(new PrescriptionSearchModel { DateFrom = model.DateFrom, DateTo = model.DateTo });
|
||||||
|
|
||||||
|
var list = new List<ReportPrescriptionProcedureViewModel>();
|
||||||
|
foreach (var prescription in prescriptions)
|
||||||
|
{
|
||||||
|
var procedures = _procedureStorage.GetFullList().Where((x) => x.ProcedureMedicines.ContainsKey(prescription.MedicineId));
|
||||||
|
foreach (var procedure in procedures)
|
||||||
|
{
|
||||||
|
var record = new ReportPrescriptionProcedureViewModel
|
||||||
|
{
|
||||||
|
DateCreate = prescription.Date,
|
||||||
|
MedicineName = prescription.MedicineName,
|
||||||
|
Number = prescription.Number,
|
||||||
|
ProcedureName = procedure.Name
|
||||||
|
};
|
||||||
|
list.Add(record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SavePatientsToExcelFile(ReportBindingModel model)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SavePatientsToWordFile(ReportBindingModel model)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace HospitalContracts.BindingModels
|
||||||
|
{
|
||||||
|
public class ReportBindingModel
|
||||||
|
{
|
||||||
|
public string FileName { get; set; } = string.Empty;
|
||||||
|
public DateTime? DateFrom { get; set; }
|
||||||
|
public DateTime? DateTo { get; set; }
|
||||||
|
|
||||||
|
public int? MedicineId { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
using HospitalContracts.BindingModels;
|
||||||
|
using HospitalContracts.ViewModels;
|
||||||
|
|
||||||
|
|
||||||
|
namespace HospitalContracts.BusinessLogicContracts
|
||||||
|
{
|
||||||
|
public interface IReportLogic
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Получение списка пациентов с указанием, какие они используют лекарства при лечении
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
ReportPatientsMedicinesViewModel GetMedicinePatients(ReportBindingModel reportBinding);
|
||||||
|
/// <summary>
|
||||||
|
/// Получение списка поступлений лекарств и процедур, в которых использованы данные лекарства
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
List<ReportPrescriptionProcedureViewModel> GetPrescriptionProcedures(ReportBindingModel reportBinding);
|
||||||
|
/// <summary>
|
||||||
|
/// Сохранение пациентов с указанием лекарств в файл-Word
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="model"></param>
|
||||||
|
void SavePatientsToWordFile(ReportBindingModel model);
|
||||||
|
/// <summary>
|
||||||
|
/// Сохранение пациентов с указанием лекарств в файл-Excel
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="model"></param>
|
||||||
|
void SavePatientsToExcelFile(ReportBindingModel model);
|
||||||
|
}
|
||||||
|
}
|
@ -4,5 +4,7 @@
|
|||||||
{
|
{
|
||||||
public int? Id { get; set; }
|
public int? Id { get; set; }
|
||||||
public int? ApothecaryId { get; set; }
|
public int? ApothecaryId { get; set; }
|
||||||
|
public DateTime? DateFrom { get; set; }
|
||||||
|
public DateTime? DateTo { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace HospitalContracts.ViewModels
|
||||||
|
{
|
||||||
|
public class ReportPatientsMedicinesViewModel
|
||||||
|
{
|
||||||
|
public string MedicineName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public List<string> Patients { get; set; } = new(); // TODO: может как-то по-другому надо хранить информацию по пациенту?
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
namespace HospitalContracts.ViewModels
|
||||||
|
{
|
||||||
|
public class ReportPrescriptionProcedureViewModel
|
||||||
|
{
|
||||||
|
public DateTime DateCreate { get; set; }
|
||||||
|
public string MedicineName { get; set; } = string.Empty;
|
||||||
|
public int Number { get; set; }
|
||||||
|
public string ProcedureName { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
@ -23,13 +23,13 @@ namespace HospitalDatabaseImplement.Implements
|
|||||||
|
|
||||||
public List<PrescriptionViewModel> GetFilteredList(PrescriptionSearchModel model)
|
public List<PrescriptionViewModel> GetFilteredList(PrescriptionSearchModel model)
|
||||||
{
|
{
|
||||||
if (!model.Id.HasValue || !model.ApothecaryId.HasValue)
|
if (!model.Id.HasValue && !model.ApothecaryId.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue)
|
||||||
{
|
{
|
||||||
return new();
|
return new();
|
||||||
}
|
}
|
||||||
using var context = new HospitalDatabase();
|
using var context = new HospitalDatabase();
|
||||||
return context.Prescriptions.Include(x => x.Apothecary).Include(x => x.Medicine)
|
return context.Prescriptions.Include(x => x.Apothecary).Include(x => x.Medicine)
|
||||||
.Where(x => x.Id == model.Id || x.ApothecaryId == model.ApothecaryId)
|
.Where(x => x.Id == model.Id || x.ApothecaryId == model.ApothecaryId || (model.DateFrom <= x.Date && x.Date <= model.DateTo))
|
||||||
.Select(x => x.GetViewModel)
|
.Select(x => x.GetViewModel)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,6 @@ namespace HospitalDatabaseImplement.Implements
|
|||||||
}
|
}
|
||||||
using var context = new HospitalDatabase();
|
using var context = new HospitalDatabase();
|
||||||
return context.Treatments
|
return context.Treatments
|
||||||
.Include(x => x.Patients) // TODO: проверить, как такое работает - нужно для получения списка пациентов по лекарству
|
|
||||||
.Include(x => x.Procedures)
|
.Include(x => x.Procedures)
|
||||||
.ThenInclude(x => x.Procedure)
|
.ThenInclude(x => x.Procedure)
|
||||||
.FirstOrDefault(x =>
|
.FirstOrDefault(x =>
|
||||||
@ -34,7 +33,6 @@ namespace HospitalDatabaseImplement.Implements
|
|||||||
}
|
}
|
||||||
using var context = new HospitalDatabase();
|
using var context = new HospitalDatabase();
|
||||||
return context.Treatments
|
return context.Treatments
|
||||||
.Include(x => x.Patients)
|
|
||||||
.Include(x => x.Procedures)
|
.Include(x => x.Procedures)
|
||||||
.ThenInclude(x => x.Procedure)
|
.ThenInclude(x => x.Procedure)
|
||||||
.Where(x => x.Name.Contains(model.Name))
|
.Where(x => x.Name.Contains(model.Name))
|
||||||
@ -48,7 +46,7 @@ namespace HospitalDatabaseImplement.Implements
|
|||||||
return context.Treatments
|
return context.Treatments
|
||||||
.Include(x => x.Patients)
|
.Include(x => x.Patients)
|
||||||
.Include(x => x.Procedures)
|
.Include(x => x.Procedures)
|
||||||
.ThenInclude(x => x.Procedure)
|
.ThenInclude(x => x.Procedure)
|
||||||
.Select(x => x.GetViewModel)
|
.Select(x => x.GetViewModel)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
@ -63,7 +61,7 @@ namespace HospitalDatabaseImplement.Implements
|
|||||||
}
|
}
|
||||||
context.Treatments.Add(newElement);
|
context.Treatments.Add(newElement);
|
||||||
context.SaveChanges();
|
context.SaveChanges();
|
||||||
return context.Treatments.Include(x => x.Patients).FirstOrDefault(x => x.Id == newElement.Id)?.GetViewModel;
|
return context.Treatments.FirstOrDefault(x => x.Id == newElement.Id)?.GetViewModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TreatmentViewModel? Update(TreatmentBindingModel model)
|
public TreatmentViewModel? Update(TreatmentBindingModel model)
|
||||||
|
@ -19,15 +19,16 @@ namespace HospitalDatabaseImplement
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void LoadPatients()
|
public static void LoadPatients()
|
||||||
{
|
{
|
||||||
// TODO return LoadData(PatientFileName, "Patient", x => Patient.Create(x)!)!;
|
|
||||||
using var context = new HospitalDatabase();
|
using var context = new HospitalDatabase();
|
||||||
|
if (context.Patients.ToList().Count > 0)
|
||||||
|
return;
|
||||||
var list = LoadData(PatientFileName, "Patient", x => Patient.Create(x)!)!;
|
var list = LoadData(PatientFileName, "Patient", x => Patient.Create(x)!)!;
|
||||||
list.ForEach(x =>
|
list.ForEach(x =>
|
||||||
{
|
{
|
||||||
context.Patients.Add(x);
|
context.Patients.Add(x);
|
||||||
context.SaveChanges();
|
|
||||||
});
|
});
|
||||||
|
context.SaveChanges();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,8 +49,7 @@ namespace HospitalDatabaseImplement
|
|||||||
{
|
{
|
||||||
using var context = new HospitalDatabase();
|
using var context = new HospitalDatabase();
|
||||||
if (context.Procedures.ToList().Count > 0)
|
if (context.Procedures.ToList().Count > 0)
|
||||||
return;
|
return;
|
||||||
// TODO return LoadData(ProcedureFileName, "Procedure", x => Procedure.Create(context, x)!)!;
|
|
||||||
var list = LoadData(ProcedureFileName, "Procedure", x => Procedure.Create(context, x)!)!;
|
var list = LoadData(ProcedureFileName, "Procedure", x => Procedure.Create(context, x)!)!;
|
||||||
list.ForEach(x =>
|
list.ForEach(x =>
|
||||||
{
|
{
|
||||||
|
@ -77,7 +77,8 @@ namespace HospitalDatabaseImplement.Models
|
|||||||
public ProcedureViewModel GetViewModel => new()
|
public ProcedureViewModel GetViewModel => new()
|
||||||
{
|
{
|
||||||
Id = Id,
|
Id = Id,
|
||||||
Name = Name
|
Name = Name,
|
||||||
|
ProcedureMedicines = ProcedureMedicines
|
||||||
};
|
};
|
||||||
|
|
||||||
public void UpdateMedicines(HospitalDatabase context, ProcedureBindingModel model)
|
public void UpdateMedicines(HospitalDatabase context, ProcedureBindingModel model)
|
||||||
|
@ -78,7 +78,8 @@ namespace HospitalDatabaseImplement.Models
|
|||||||
public TreatmentViewModel GetViewModel => new()
|
public TreatmentViewModel GetViewModel => new()
|
||||||
{
|
{
|
||||||
Id = Id,
|
Id = Id,
|
||||||
Name = Name
|
Name = Name,
|
||||||
|
TreatmentProcedures = TreatmentProcedures
|
||||||
};
|
};
|
||||||
|
|
||||||
public void UpdateProcedures(HospitalDatabase context, TreatmentBindingModel model)
|
public void UpdateProcedures(HospitalDatabase context, TreatmentBindingModel model)
|
||||||
|
@ -12,6 +12,6 @@
|
|||||||
<Name>Имя 2</Name>
|
<Name>Имя 2</Name>
|
||||||
<Patronymic>Отчество 1</Patronymic>
|
<Patronymic>Отчество 1</Patronymic>
|
||||||
<BirthDate>15.04.2001</BirthDate>
|
<BirthDate>15.04.2001</BirthDate>
|
||||||
<TreatmentId>2</TreatmentId>
|
<TreatmentId>1</TreatmentId>
|
||||||
</Patient>
|
</Patient>
|
||||||
</Patients>
|
</Patients>
|
Loading…
Reference in New Issue
Block a user