CourseWork_Borschevskaya_A..../Hospital/HospitalDatabaseImplement/Models/Procedure.cs

111 lines
4.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
using System.Xml.Linq;
namespace HospitalDatabaseImplement.Models
{
public class Procedure : IProcedureModel
{
public int Id { get; private set; }
[Required]
[MaxLength(50)]
public string Name { get; private set; } = string.Empty;
private Dictionary<int, IMedicineModel>? _procedureMedicines = null;
[NotMapped]
public Dictionary<int, IMedicineModel> ProcedureMedicines { get
{
if (_procedureMedicines == null)
{
_procedureMedicines = Medicines.ToDictionary(rec => rec.MedicineId, rec =>
rec.Medicine as IMedicineModel);
}
return _procedureMedicines;
}
}
[ForeignKey("ProcedureId")]
public virtual List<ProcedureMedicine> Medicines { get; set; } = new();
[ForeignKey("ProcedureId")]
public virtual List<TreatmentProcedure> Treatments { get; set; } = new();
public static Procedure Create(HospitalDatabase context, ProcedureBindingModel model)
{
return new Procedure()
{
Id = model.Id,
Name = model.Name,
Medicines = model.ProcedureMedicines.Select(x => new ProcedureMedicine
{
Medicine = context.Medicines.First(y => y.Id == x.Key),
}).ToList()
};
}
public static Procedure? Create(XElement element)
{
if (element == null)
{
return null;
}
return new Procedure()
{
Name = element.Element("Name")!.Value,
// при чтении из файла мы не можем загрузить сведения о лекарствах в процедуре (Medicines),
// так как на данном этапе нет созданных записей о лекарствах
// привязка будет осуществляться позднее - на клиенте будет данная возможность на дополнительной формочке
// Medicines = new()
};
}
public void Update(ProcedureBindingModel model)
{
Name = model.Name;
}
public ProcedureViewModel GetViewModel => new()
{
Id = Id,
Name = Name,
ProcedureMedicines = ProcedureMedicines
};
public void UpdateMedicines(HospitalDatabase context, ProcedureBindingModel model)
{
var procedureMedicines = context.ProcedureMedicines.Where(rec => rec.ProcedureId == model.Id).ToList();
if (procedureMedicines != null && procedureMedicines.Count > 0)
{
context.ProcedureMedicines.RemoveRange(procedureMedicines.Where(rec
=> !model.ProcedureMedicines.ContainsKey(rec.MedicineId)));
context.SaveChanges();
}
var procedure = context.Procedures.First(x => x.Id == Id);
var existingMedicineIds = procedureMedicines?.Select(x => x.MedicineId).ToList();
foreach (var pm in model.ProcedureMedicines)
{
if (existingMedicineIds != null && !existingMedicineIds.Contains(pm.Key))
{
context.ProcedureMedicines.Add(new ProcedureMedicine
{
Procedure = procedure,
Medicine = context.Medicines.First(x => x.Id == pm.Key),
});
}
}
context.SaveChanges();
_procedureMedicines = null;
}
}
}