diff --git a/.vs/HospitalServerManager/v15/.suo b/.vs/HospitalServerManager/v15/.suo index ba53633..760c65e 100644 Binary files a/.vs/HospitalServerManager/v15/.suo and b/.vs/HospitalServerManager/v15/.suo differ diff --git a/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide b/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide index 63436ee..a687ca1 100644 Binary files a/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide and b/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide differ diff --git a/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide-shm b/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide-shm index b2d9721..399190d 100644 Binary files a/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide-shm and b/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide-shm differ diff --git a/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide-wal b/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide-wal index 5f33c40..1e69014 100644 Binary files a/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide-wal and b/.vs/HospitalServerManager/v15/Server/sqlite3/storage.ide-wal differ diff --git a/HospitalServerManager.csproj b/HospitalServerManager.csproj index 2e62842..226ce53 100644 --- a/HospitalServerManager.csproj +++ b/HospitalServerManager.csproj @@ -122,9 +122,18 @@ + + AdmissionsPage.xaml + + + DiagnosesPage.xaml + DoctorsPage.xaml + + EditRecordDialog.xaml + MainFrameView.xaml @@ -162,10 +171,22 @@ MSBuild:Compile Designer + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/InterfacesAndEnums/Interfaces.cs b/InterfacesAndEnums/Interfaces.cs index 64429ec..a8c7e02 100644 --- a/InterfacesAndEnums/Interfaces.cs +++ b/InterfacesAndEnums/Interfaces.cs @@ -7,8 +7,9 @@ using Windows.UI.Xaml.Controls; namespace HospitalServerManager.InterfacesAndEnums { - public interface ISqlTableModelable : IPrimaryKeyGetable + public interface ISqlTableModel { + List GetColumnNames(); } public interface IPrimaryKeyGetable diff --git a/Model/Basic/Admission.cs b/Model/Basic/Admission.cs index a48d5d9..3a05bb9 100644 --- a/Model/Basic/Admission.cs +++ b/Model/Basic/Admission.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -9,7 +10,7 @@ namespace HospitalServerManager.Model.Basic class Admission : SqlTable { public DateTime AdmissionDate { get; protected set; } - public DateTime LeavingDate { get; protected set; } + public DateTime? LeavingDate { get; protected set; } public string PatientPESEL { get; protected set; } public string DiagnosisSymbol { get; protected set; } public int MainDoctor { get; protected set; } @@ -30,5 +31,19 @@ namespace HospitalServerManager.Model.Basic RoomNumber = int.Parse(listOfValues[7]); IsPlanned = bool.Parse(listOfValues[8]); } + [JsonConstructor] + protected Admission(string admissionID, DateTime admissionDate, DateTime? endDate, string patientPESEL, string diagnosisSymbol, + int mainDoctor, int planedOperation, int roomNumber, bool isPlanned) + : base (admissionID, "Id_przyjecia", new List()) + { + AdmissionDate = admissionDate; + LeavingDate = endDate ?? null; + PatientPESEL = patientPESEL; + DiagnosisSymbol = diagnosisSymbol; + MainDoctor = mainDoctor; + OperationID = planedOperation; + RoomNumber = roomNumber; + IsPlanned = isPlanned; + } } } diff --git a/Model/Basic/Diagnosis.cs b/Model/Basic/Diagnosis.cs index 57b25b2..b1648e0 100644 --- a/Model/Basic/Diagnosis.cs +++ b/Model/Basic/Diagnosis.cs @@ -1,4 +1,5 @@ using HospitalServerManager.InterfacesAndEnums; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; @@ -21,5 +22,13 @@ namespace HospitalServerManager.Model.Basic FieldOfSurgery = listOfValues[2].GetEnumFromDescription(); Description = listOfValues[3]; } + [JsonConstructor] + protected Diagnosis(string icdSymbol, string name, string fieldOfSurgery, string description) + : base(icdSymbol, "Symbol_ICD", new List()) + { + Name = name; + FieldOfSurgery = fieldOfSurgery.GetEnumFromDescription(); + Description = description; + } } } diff --git a/Model/Basic/Room.cs b/Model/Basic/Room.cs index 45a18f5..4abfe54 100644 --- a/Model/Basic/Room.cs +++ b/Model/Basic/Room.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -19,5 +20,12 @@ namespace HospitalServerManager.Model.Basic PlacesNumber = placesNumber; IsSpecialCare = bool.Parse(listOfValues[2]); } + [JsonConstructor] + protected Room(int roomNumber, int numberOfBeds, bool increasedCare) + :base(roomNumber.ToString(), "Nr_sali", new List()) + { + PlacesNumber = numberOfBeds; + IsSpecialCare = increasedCare; + } } } diff --git a/Model/Basic/SqlTable.cs b/Model/Basic/SqlTable.cs index 3971461..363cebb 100644 --- a/Model/Basic/SqlTable.cs +++ b/Model/Basic/SqlTable.cs @@ -8,11 +8,11 @@ using HospitalServerManager.Model.Controllers; namespace HospitalServerManager.Model.Basic { - internal abstract class SqlTable : ISqlTableModelable + internal abstract class SqlTable : ISqlTableModel { // TODO: Dodac table do klas modelu public string PrimaryKey { get; protected set; } - protected string PrimaryKeyName { get; set; } + public string PrimaryKeyName { get; set; } protected List ColumnNames { get; set; } protected SqlTable() { @@ -27,19 +27,9 @@ namespace HospitalServerManager.Model.Basic ColumnNames = columnNames; } - public string GetPrimaryKey() - { - return PrimaryKey; - } - - public string GetPrimaryKeyName() - { - return PrimaryKeyName; - } - - public List GetColumnNames() - { - return ColumnNames; - } - } + public List GetColumnNames() + { + return ColumnNames; + } + } } diff --git a/Model/Controllers/ApiCommandProvider.cs b/Model/Controllers/ApiCommandProvider.cs index 4667446..f4f5b17 100644 --- a/Model/Controllers/ApiCommandProvider.cs +++ b/Model/Controllers/ApiCommandProvider.cs @@ -20,7 +20,7 @@ namespace HospitalServerManager.Model.Controllers { return @"/getcolumntypes/" + tableName; } - public static string CreateNewRecordAsync(string tableName, List valuesList) + public static string CreateNewRecord(string tableName, List valuesList) { string createRequest = "/insertrec/" + tableName + "/nr/" + valuesList.Count() + "/pk/" + valuesList[0]; for(int i = 1; i<8; i++) @@ -33,5 +33,26 @@ namespace HospitalServerManager.Model.Controllers } return createRequest; } + public static string UpdateRecordHttpRequest(string tableName, string primaryKey, string primaryKeyName, string fieldToUpdate, string valueToUpdate) + { + string updateRequest = "/updaterec/" + tableName + "/pk/" + primaryKey + "/pkn/"; + updateRequest += primaryKeyName + "/ftu/" + fieldToUpdate + "/vti/" + valueToUpdate; + return updateRequest; + } + public static string DeleteRecordHttpRequest(string tableName, string primaryKey, string primaryKeyName) + { + string updateRequest = "/deleterec/" + tableName + "/pk/" + primaryKey + "/pkn/" + primaryKeyName; + return updateRequest; + } + public static string SortedRecordsHttpRequest(string tableName, string orderBy, string criterium) + { + string sortReq = "/sort/" + tableName + "/sortby/" + orderBy + "/sorttype/" + criterium; + return sortReq; + } + public static string SearchRecordHttpRequest(string tableName, string orderBy, string criterium, string searchIn, string searchValue) + { + string search = "/search/" + tableName + "/where/" + searchIn + "/is/" + searchValue + "/sortby/" + orderBy + "/sorttype/" + criterium; + return search; + } } } diff --git a/Model/Controllers/WebService.cs b/Model/Controllers/WebService.cs index 4c35129..4448c18 100644 --- a/Model/Controllers/WebService.cs +++ b/Model/Controllers/WebService.cs @@ -9,6 +9,7 @@ using System.Net.Http.Headers; using HospitalServerManager.InterfacesAndEnums; using Newtonsoft.Json; using System.IO; +using HospitalServerManager.Model.Basic; namespace HospitalServerManager.Model.Controllers { @@ -32,21 +33,41 @@ namespace HospitalServerManager.Model.Controllers { httpClient.BaseAddress = baseAdress; httpClient.DefaultRequestHeaders.Clear(); - //httpClient.DefaultRequestHeaders.Add("JSON", new MediaTypeWithQualityHeaderValue("application/json")); } public async Task> GetRecordAsync(string tableName) { // TODO: SPRAWDZIC CZY IMPLEMENTUJE INTERFACE!! - List modelsList = new List(); - //using (var client = httpClient) + List modelsList = new List(); using (var message = new HttpRequestMessage(HttpMethod.Get, ApiCommandProvider.GetRecordHttpRequest(tableName))) using (var response = await httpClient.SendAsync(message)) { response.EnsureSuccessStatusCode(); var stream = await response.Content.ReadAsStreamAsync(); return DeserializeJsonFromStream>(stream); - //return JsonConvert.DeserializeObject>(content); + } + } + public async Task> GetSortedRecordsAsync(string tableName, string orderBy, string criterium) + { + List modelsList = new List(); + using (var message = new HttpRequestMessage(HttpMethod.Get, ApiCommandProvider.SortedRecordsHttpRequest(tableName, orderBy, criterium))) + using (var response = await httpClient.SendAsync(message)) + { + response.EnsureSuccessStatusCode(); + var stream = await response.Content.ReadAsStreamAsync(); + return DeserializeJsonFromStream>(stream); + } + } + public async Task> SearchRecordsAsync(string tableName, string orderBy, string criterium, string searchIn, string searchValue) + { + List modelsList = new List(); + using (var message = new HttpRequestMessage(HttpMethod.Get, + ApiCommandProvider.SearchRecordHttpRequest(tableName, orderBy, criterium, searchIn, searchValue))) + using (var response = await httpClient.SendAsync(message)) + { + response.EnsureSuccessStatusCode(); + var stream = await response.Content.ReadAsStreamAsync(); + return DeserializeJsonFromStream>(stream); } } public async Task> GetColumnNamesAsync(string tableName) @@ -56,6 +77,7 @@ namespace HospitalServerManager.Model.Controllers { response.EnsureSuccessStatusCode(); var columns = await response.Content.ReadAsStringAsync(); + columns = columns.Remove(0, 1); var columnNames = columns.Split("."); var x = columnNames.ToList(); x.RemoveAt(x.Count - 1); @@ -82,7 +104,27 @@ namespace HospitalServerManager.Model.Controllers } public async Task CreateNewRecordAsync(string tableName, IEnumerable valuesList) { - using (var message = new HttpRequestMessage(HttpMethod.Get, ApiCommandProvider.CreateNewRecordAsync(tableName, valuesList.ToList()))) + using (var message = new HttpRequestMessage(HttpMethod.Get, ApiCommandProvider.CreateNewRecord(tableName, valuesList.ToList()))) + using (var response = await httpClient.SendAsync(message)) + { + response.EnsureSuccessStatusCode(); + return true; + } + } + public async Task UpdateRecordAsync(string tableName, string primaryKey, string primaryKeyName, string fieldToEdit, string valueToUpdate) + { + using (var message = new HttpRequestMessage(HttpMethod.Get, + ApiCommandProvider.UpdateRecordHttpRequest(tableName, primaryKey, primaryKeyName, fieldToEdit, valueToUpdate))) + using (var response = await httpClient.SendAsync(message)) + { + response.EnsureSuccessStatusCode(); + return true; + } + } + public async Task DeleteRecordAsync(string tableName, string primaryKey, string primaryKeyName) + { + using (var message = new HttpRequestMessage(HttpMethod.Get, + ApiCommandProvider.DeleteRecordHttpRequest(tableName, primaryKey, primaryKeyName))) using (var response = await httpClient.SendAsync(message)) { response.EnsureSuccessStatusCode(); @@ -103,11 +145,5 @@ namespace HospitalServerManager.Model.Controllers return searchResult; } } - - - private string GetRecordHttpRequest(string tableName) - { - return @"/getfromdb/" + tableName; - } } } diff --git a/Model/ModelRoster.cs b/Model/ModelRoster.cs index 843c657..5823d0d 100644 --- a/Model/ModelRoster.cs +++ b/Model/ModelRoster.cs @@ -7,18 +7,19 @@ using System.Threading.Tasks; using HospitalServerManager.InterfacesAndEnums; using HospitalServerManager.Model.Basic; using HospitalServerManager.Model.Controllers; +using Windows.UI.Popups; namespace HospitalServerManager.Model { class ModelRoster { - private List _modelsList = new List(); + private List _modelsList = new List(); private WebService webService = new WebService(new Uri("http://localhost:8080/")); public string ActualTableName { get; private set; } public IEnumerable ColumnNames { get; private set; } public IDictionary ColumnTypes { get; private set; } public Dictionary EnumTypes { get; protected set; } - public IEnumerable ModelsEnumerable { get => _modelsList; } + public IEnumerable ModelsEnumerable { get => _modelsList; } //private Controllers.DatabaseReader DatabaseReader = new Controllers.DatabaseReader(); public ModelRoster() { @@ -32,35 +33,66 @@ namespace HospitalServerManager.Model _modelsList.Clear(); if(ColumnNames.Any()) ColumnNames.ToList().Clear(); - /*MethodInfo method = typeof(WebService).GetMethod("GetRecordAsync"); - method = method.MakeGenericMethod(type); - var resp = method.Invoke(webService, new[] { "Pacjenci" });*/ ActualTableName = tableName; - ColumnNames = await GetColumnNames(); - ColumnTypes = await GetColumnTypes(); - IEnumerable response = new List(); + /*ColumnNames = await GetColumnNames(); + ColumnTypes = await GetColumnTypes();*/ + IEnumerable response = new List(); if(tableName == "Pacjenci") response = await webService.GetRecordAsync(tableName); else if(tableName == "Lekarze") response = await webService.GetRecordAsync(tableName); _modelsList.AddRange(response); - - //ColumnNames = await GetColumnNames(); } - public async Task> GetColumnNames() + public async Task> GetColumnNames(string tableName) { + ActualTableName = tableName; if (ActualTableName == string.Empty) throw new Exception(); - return await webService.GetColumnNamesAsync(ActualTableName); + ColumnNames = await webService.GetColumnNamesAsync(ActualTableName); + + return ColumnNames; } - public async Task> GetColumnTypes() + public async Task> GetColumnTypes(string tableName) { + ActualTableName = tableName; if (ActualTableName == string.Empty) throw new Exception(); - return await webService.GetColumnTypesAsync(ActualTableName); + ColumnTypes = await webService.GetColumnTypesAsync(ActualTableName); + return ColumnTypes; } public async void CreateRecord(string tableName, IEnumerable valueList) { await webService.CreateNewRecordAsync(tableName, valueList); } + public async void UpdateRecord(string tableName, string primaryKey, string primaryKeyName, string fieldToUpdate, string valueToUpdate) + { + await webService.UpdateRecordAsync(tableName, primaryKey, primaryKeyName, fieldToUpdate, valueToUpdate); + } + public async void DeleteRecord(string tableName, SqlTable modelToDelete) + { + if(!(modelToDelete is Admission)) + { + var centralTableRecords = await webService.GetRecordAsync("Przyjecia"); + if (IsCentralTableContainsDeletedModelForeginKey(tableName, modelToDelete.PrimaryKey, centralTableRecords.ToList())) + { + IUICommand response = null; + MessageDialog mDialog = new MessageDialog("W tabeli Przyjęcia znajduje się odwołanie do usuwanego rekordu." + + "Jeśli usuniesz ten rekord, wpis z tabeli Przyjęcia zostanie również usunięty. Czy nadal chcesz usunąć rekord?"); + mDialog.Commands.Add(new UICommand("Tak, usuń")); + mDialog.Commands.Add(new UICommand("Nie, pozostaw rekord")); + response = await mDialog.ShowAsync(); + if (response == mDialog.Commands.First()) + { + DeleteRecord("Przyjecia", modelToDelete.PrimaryKey, GetForeignKeyNameFromAdmissionsTable(tableName)); + DeleteRecord(tableName, modelToDelete.PrimaryKey, modelToDelete.PrimaryKeyName); + } + } + } + else + DeleteRecord(tableName, modelToDelete.PrimaryKey, modelToDelete.PrimaryKeyName); + } + private async void DeleteRecord(string tableName, string primaryKey, string primaryKeyName) + { + await webService.DeleteRecordAsync(tableName, primaryKey, primaryKeyName); + } private Dictionary CreateEnumTypesDictionary() { // TODO: Uzupełniać w miare dodawania tabel! @@ -70,12 +102,133 @@ namespace HospitalServerManager.Model newDictionary.Add("Stopien_naukowy", typeof(AcademicDegrees)); newDictionary.Add("Specjalizacja", typeof(MedicalSpecializations)); newDictionary.Add("Stanowisko", typeof(JobPositions)); + newDictionary.Add("Dziedzina_chirurgii", typeof(SurgeryField)); return newDictionary; } - public void AddRange(IEnumerable modelsList) + + public void AddRange(IEnumerable modelsList) { _modelsList.Clear(); _modelsList.AddRange(modelsList); } - } + private string GetForeignKeyNameFromAdmissionsTable(string typeOfTable) + { + string stringToReturn = null; + switch (typeOfTable) + { + case "Przyjecia": + stringToReturn = null; + break; + case "Pacjenci": + stringToReturn = "PESEL_pacjenta"; + break; + case "Lekarze": + stringToReturn = "Lekarz_prowadzacy"; + break; + case "Diagnozy": + stringToReturn = "Symbol_diagnozy"; + break; + case "Operacje": + stringToReturn = "Planowana_operacja"; + + break; + case "Sale": + stringToReturn = "Nr_sali"; + break; + } + + return stringToReturn; + } + private bool IsCentralTableContainsDeletedModelForeginKey(string tableName, string searchedModelPrimaryKey, List centralTableList) + { + bool contains; + switch (tableName) + { + case "Przyjecia": + contains = false; + break; + case "Pacjenci": + contains = centralTableList.FindIndex(x => x.PatientPESEL == searchedModelPrimaryKey) >= 0 ? true : false; + break; + case "Lekarze": + contains = centralTableList.FindIndex(x => x.MainDoctor.ToString() == searchedModelPrimaryKey) >= 0 ? true : false; + break; + case "Diagnozy": + contains = centralTableList.FindIndex(x => x.DiagnosisSymbol == searchedModelPrimaryKey) >= 0 ? true : false; + break; + case "Operacje": + contains = centralTableList.FindIndex(x => x.OperationID.ToString() == searchedModelPrimaryKey) >= 0 ? true : false; + break; + case "Sale": + contains = centralTableList.FindIndex(x => x.RoomNumber.ToString() == searchedModelPrimaryKey) >= 0 ? true : false; + break; + default: + contains = false; + break; + } + + return contains; + } + public async Task Sort(string tableName, string orderBy, string criterium) + { + _modelsList.Clear(); + IEnumerable response = new List(); + switch (tableName) + { + case "Przyjecia": + response = await webService.GetSortedRecordsAsync(tableName, orderBy, criterium); + break; + case "Pacjenci": + response = await webService.GetSortedRecordsAsync(tableName, orderBy, criterium); + break; + case "Lekarze": + response = await webService.GetSortedRecordsAsync(tableName, orderBy, criterium); + break; + case "Diagnozy": + response = await webService.GetSortedRecordsAsync(tableName, orderBy, criterium); + break; + case "Operacje": + response = await webService.GetSortedRecordsAsync(tableName, orderBy, criterium); + break; + case "Sale": + response = await webService.GetSortedRecordsAsync(tableName, orderBy, criterium); + break; + default: + response = null; + break; + } + _modelsList.AddRange(response); + } + public async Task Search(string tableName, string orderBy, string criterium, string searchIn, string searchValue) + { + _modelsList.Clear(); + IEnumerable response = new List(); + switch (tableName) + { + case "Przyjecia": + response = await webService.SearchRecordsAsync(tableName, orderBy, criterium, searchIn, searchValue); + break; + case "Pacjenci": + response = await webService.SearchRecordsAsync(tableName, orderBy, criterium, searchIn, searchValue); + break; + case "Lekarze": + response = await webService.SearchRecordsAsync(tableName, orderBy, criterium, searchIn, searchValue); + break; + case "Diagnozy": + response = await webService.SearchRecordsAsync(tableName, orderBy, criterium, searchIn, searchValue); + break; + case "Operacje": + response = await webService.SearchRecordsAsync(tableName, orderBy, criterium, searchIn, searchValue); + break; + case "Sale": + response = await webService.SearchRecordsAsync(tableName, orderBy, criterium, searchIn, searchValue); + break; + default: + response = null; + break; + } + if(response != null && response.Any()) + _modelsList.AddRange(response); + } + } } diff --git a/View/AdmissionsPage.xaml b/View/AdmissionsPage.xaml new file mode 100644 index 0000000..2b77429 --- /dev/null +++ b/View/AdmissionsPage.xaml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + +