232 lines
7.9 KiB
C#
232 lines
7.9 KiB
C#
|
using HospitalContracts.BindingModels;
|
|||
|
using HospitalContracts.ViewModels;
|
|||
|
using HospitalDataModels.Models;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.ComponentModel.DataAnnotations;
|
|||
|
using System.ComponentModel.DataAnnotations.Schema;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace HospitalDatabaseImplement.Models
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Сущность "Пациент"
|
|||
|
/// </summary>
|
|||
|
public class Patient : IPatientModel
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Идентификатор
|
|||
|
/// </summary>
|
|||
|
public int Id { get; private set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// ФИО пациента
|
|||
|
/// </summary>
|
|||
|
[Required]
|
|||
|
[MaxLength(100)]
|
|||
|
public string FullName { get; private set; } = string.Empty;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Дата рождения пациента
|
|||
|
/// </summary>
|
|||
|
[Required]
|
|||
|
public DateTime BirthDate { get; private set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Номер телефона пациента
|
|||
|
/// </summary>
|
|||
|
[Required]
|
|||
|
[MaxLength(16)]
|
|||
|
public string Phone { get; private set; } = string.Empty;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Идентификатор лечащего врача
|
|||
|
/// </summary>
|
|||
|
[ForeignKey("DoctorId")]
|
|||
|
public int DoctorId { get; private set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Лечащий врач
|
|||
|
/// </summary>
|
|||
|
public virtual Doctor Doctor { get; private set; } = new();
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Связь с таблицей связи для сущностей "Пациент" и "Рецепт"
|
|||
|
/// </summary>
|
|||
|
[ForeignKey("PatientId")]
|
|||
|
public virtual List<PatientRecipe> Recipes { get; set; } = new();
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Список рецептов пациента
|
|||
|
/// </summary>
|
|||
|
private Dictionary<int, IRecipeModel>? _patientRecipes = null;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Список рецептов пациента
|
|||
|
/// </summary>
|
|||
|
[NotMapped]
|
|||
|
public Dictionary<int, IRecipeModel> PatientRecipes
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_patientRecipes == null)
|
|||
|
{
|
|||
|
_patientRecipes = Recipes
|
|||
|
.ToDictionary(recPR => recPR.RecipeId, recPR => (recPR.Recipe as IRecipeModel));
|
|||
|
}
|
|||
|
return _patientRecipes;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Связь с таблицей связи для сущностей "Пациент" и "Процедура"
|
|||
|
/// </summary>
|
|||
|
[ForeignKey("PatientId")]
|
|||
|
public virtual List<PatientProcedure> Procedures { get; set; } = new();
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Список процедур пациента
|
|||
|
/// </summary>
|
|||
|
private Dictionary<int, IProcedureModel>? _patientProcedures = null;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Список процедур пациента
|
|||
|
/// </summary>
|
|||
|
[NotMapped]
|
|||
|
public Dictionary<int, IProcedureModel> PatientProcedures
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_patientProcedures == null)
|
|||
|
{
|
|||
|
_patientProcedures = Procedures
|
|||
|
.ToDictionary(recPP => recPP.ProcedureId, recPP => (recPP.Procedure as IProcedureModel));
|
|||
|
}
|
|||
|
return _patientProcedures;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Cоздать сущность
|
|||
|
/// </summary>
|
|||
|
/// <param name="context"></param>
|
|||
|
/// <param name="model"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public static Patient? Create(HospitalDatabase context, PatientBindingModel model)
|
|||
|
{
|
|||
|
if (model == null)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
return new Patient()
|
|||
|
{
|
|||
|
Id = model.Id,
|
|||
|
FullName = model.FullName,
|
|||
|
BirthDate = model.BirthDate,
|
|||
|
Phone = model.Phone,
|
|||
|
DoctorId = model.DoctorId,
|
|||
|
Doctor = context.Doctors
|
|||
|
.First(x => x.Id == model.DoctorId),
|
|||
|
Recipes = model.PatientRecipes.Select(x => new PatientRecipe
|
|||
|
{
|
|||
|
Recipe = context.Recipes.First(y => y.Id == x.Key)
|
|||
|
}).ToList(),
|
|||
|
Procedures = model.PatientProcedures.Select(x => new PatientProcedure
|
|||
|
{
|
|||
|
Procedure = context.Procedures.First(y => y.Id == x.Key)
|
|||
|
}).ToList()
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Изменить сущность
|
|||
|
/// </summary>
|
|||
|
/// <param name="model"></param>
|
|||
|
public void Update(PatientBindingModel model)
|
|||
|
{
|
|||
|
if (model == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
FullName = model.FullName;
|
|||
|
BirthDate = model.BirthDate;
|
|||
|
Phone = model.Phone;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получить модель представления
|
|||
|
/// </summary>
|
|||
|
public PatientViewModel GetViewModel => new()
|
|||
|
{
|
|||
|
Id = Id,
|
|||
|
FullName = FullName,
|
|||
|
BirthDate = BirthDate,
|
|||
|
Phone = Phone,
|
|||
|
DoctorId = DoctorId,
|
|||
|
DoctorFullName = Doctor.FullName,
|
|||
|
PatientRecipes = PatientRecipes,
|
|||
|
PatientProcedures = PatientProcedures
|
|||
|
};
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Обновить связи с рецептами
|
|||
|
/// </summary>
|
|||
|
/// <param name="context"></param>
|
|||
|
/// <param name="model"></param>
|
|||
|
public void UpdateRecipes(HospitalDatabase context, PatientBindingModel model)
|
|||
|
{
|
|||
|
var patientRecipes = context.PatientRecipes.Where(rec => rec.PatientId == model.Id).ToList();
|
|||
|
if (patientRecipes != null && patientRecipes.Count > 0)
|
|||
|
{
|
|||
|
// Удаление рецептов, не относящихся к пациенту
|
|||
|
context.PatientRecipes.RemoveRange(patientRecipes.Where(rec => !model.PatientRecipes.ContainsKey(rec.RecipeId)));
|
|||
|
context.SaveChanges();
|
|||
|
}
|
|||
|
|
|||
|
var patient = context.Patients.First(x => x.Id == Id);
|
|||
|
foreach (var pr in model.PatientRecipes)
|
|||
|
{
|
|||
|
context.PatientRecipes.Add(new PatientRecipe
|
|||
|
{
|
|||
|
Patient = patient,
|
|||
|
Recipe = context.Recipes.First(x => x.Id == pr.Key)
|
|||
|
});
|
|||
|
context.SaveChanges();
|
|||
|
}
|
|||
|
_patientRecipes = null;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Обновить связи с процедурами
|
|||
|
/// </summary>
|
|||
|
/// <param name="context"></param>
|
|||
|
/// <param name="model"></param>
|
|||
|
public void UpdateProcedures(HospitalDatabase context, PatientBindingModel model)
|
|||
|
{
|
|||
|
var patientProcedures = context.PatientProcedures.Where(rec => rec.PatientId == model.Id).ToList();
|
|||
|
if (patientProcedures != null && patientProcedures.Count > 0)
|
|||
|
{
|
|||
|
// Удаление процедур, не относящихся к пациенту
|
|||
|
context.PatientProcedures.RemoveRange(patientProcedures.Where(rec => !model.PatientProcedures.ContainsKey(rec.ProcedureId)));
|
|||
|
context.SaveChanges();
|
|||
|
}
|
|||
|
|
|||
|
var patient = context.Patients.First(x => x.Id == Id);
|
|||
|
foreach (var pp in model.PatientProcedures)
|
|||
|
{
|
|||
|
context.PatientProcedures.Add(new PatientProcedure
|
|||
|
{
|
|||
|
Patient = patient,
|
|||
|
Procedure = context.Procedures.First(x => x.Id == pp.Key)
|
|||
|
});
|
|||
|
context.SaveChanges();
|
|||
|
}
|
|||
|
_patientProcedures = null;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|