using ClosedXML.Excel; using HospitalManagementSystem.Dto; using HospitalManagementSystem.GlobalEnum; using HospitalManagementSystem.Patients.Dto; using HospitalManagementSystem.Permissions; using Microsoft.AspNetCore.Authorization; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Linq.Dynamic.Core; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; namespace HospitalManagementSystem.Patients { public class PatientAppService : ApplicationService { private IRepository _patientrecordRepository; private IRepository _patientRepository; public PatientAppService(IRepository patientrecordRepository, IRepository patientRepository) { _patientrecordRepository = patientrecordRepository; _patientRepository = patientRepository; } #region PatientRecord #region Get Patient List with Paging and Searching [Authorize(HospitalManagementSystemPermissions.Patient.Default)] public async Task> GetPatientRecordListAsync(PagingSortPatientResultDto input, Guid Id) { //List? query; //query = _patientrecordRepository.GetQueryableAsync().Result // .Include(x => x.Patients) // .WhereIf(!String.IsNullOrEmpty(input.Search), x => x.Patients.Name.ToLower().Contains(input.Search.ToLower())) // .Where(x => x.Patients.Id == Id) // .OrderBy(input.Sorting ?? (nameof(PatientRecord.Id) + " asc")) // .Skip(input.SkipCount) // .Take(input.MaxResultCount) // .ToList(); //var totalCount = await _patientrecordRepository.CountAsync(); //return new PagedResultDto( // totalCount, // ObjectMapper.Map, List>(query) //); var queryable = await _patientrecordRepository.GetQueryableAsync(); var filteredQuery = queryable .Include(x => x.Patients) .WhereIf(!string.IsNullOrEmpty(input.Search), x => x.Patients.Name.ToLower().Contains(input.Search.ToLower())) .Where(x => x.Patients.Id == Id); // Get total count after filtering var totalCount = await filteredQuery.CountAsync(); // Apply sorting dynamically (ensure input.Sorting is valid) filteredQuery = !string.IsNullOrEmpty(input.Sorting) ? filteredQuery.OrderBy(input.Sorting) : filteredQuery.OrderBy(x => x.Id); // Apply paging var pagedQuery = await filteredQuery .Skip(input.SkipCount) .Take(input.MaxResultCount) .ToListAsync(); return new PagedResultDto( totalCount, ObjectMapper.Map, List>(pagedQuery) ); } #endregion #region Get Single Patient by Id [Authorize(HospitalManagementSystemPermissions.Patient.Default)] public async Task GetPatientRecordByIdAsync(Guid id) { var patient = await _patientrecordRepository.GetAsync(id); return ObjectMapper.Map(patient); } #endregion #region Export Patient Data to Excel public async Task GetExportPatientRecordAsync() { var patients = await _patientrecordRepository.GetListAsync(); var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports"); if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); // Ensure the folder exists } var filename = "Patients_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx"; var filePath = Path.Combine(folderPath, filename); // Create a workbook and worksheet using (var workbook = new XLWorkbook()) { var worksheet = workbook.Worksheets.Add("Patients"); // Add headers worksheet.Cell(1, 1).Value = "Full Name"; worksheet.Cell(1, 2).Value = "Gender"; worksheet.Cell(1, 3).Value = "Date of Admission"; worksheet.Cell(1, 4).Value = "Diagnosis"; worksheet.Cell(1, 5).Value = "Next Follow-Up"; worksheet.Cell(1, 6).Value = "Status"; for (int i = 0; i < patients.Count; i++) { worksheet.Cell(i + 2, 1).Value = patients[i].Patients.Name; worksheet.Cell(i + 2, 2).Value = patients[i].Patients.Gender.ToString(); worksheet.Cell(i + 2, 3).Value = patients[i].DateOfAdmission.ToShortDateString(); worksheet.Cell(i + 2, 4).Value = patients[i].Diagnosis; worksheet.Cell(i + 2, 5).Value = patients[i].NextFollowUp?.ToShortDateString(); worksheet.Cell(i + 2, 6).Value = patients[i].Status.ToString(); } worksheet.Columns().AdjustToContents(); workbook.SaveAs(filePath); } byte[] fileBytes = await File.ReadAllBytesAsync(filePath); File.Delete(filePath); return new FileDownloadDto { FileName = filename, FileContent = Convert.ToBase64String(fileBytes) // Use Base64 encoding for file content }; } #endregion #region Create Patient [Authorize(HospitalManagementSystemPermissions.Patient.Create)] public async Task CreatePatientRecordAsync(CreateUpdatePatientRecordDto input) { var patientEntity = await _patientRepository.GetAsync(input.PatientId); // Get Patient from DB var patientRecord = ObjectMapper.Map(input); patientRecord.Patients = patientEntity; // Assign the fetched entity patientRecord = await _patientrecordRepository.InsertAsync(patientRecord); return ObjectMapper.Map(patientRecord); } #endregion #region Update Patient [Authorize(HospitalManagementSystemPermissions.Patient.Edit)] public async Task UpdatePatientRecordAsync(Guid id, CreateUpdatePatientRecordDto input) { var patientRecord = await _patientrecordRepository.GetAsync(id); if (patientRecord.Patients.Id != input.PatientId) // If PatientId is updated, fetch new Patient { var newPatient = await _patientRepository.GetAsync(input.PatientId); patientRecord.Patients = newPatient; } ObjectMapper.Map(input, patientRecord); patientRecord = await _patientrecordRepository.UpdateAsync(patientRecord); return ObjectMapper.Map(patientRecord); } #endregion #region Delete Patient [Authorize(HospitalManagementSystemPermissions.Patient.Delete)] public async Task DeletePatientRecordAsync(Guid id) { await _patientrecordRepository.DeleteAsync(id); } #endregion #endregion #region Patient #region Get Patient List with Paging and Searching [Authorize(HospitalManagementSystemPermissions.Patient.Default)] public async Task> GetPatientListAsync(PagingSortPatientResultDto input) { List query; if (!string.IsNullOrEmpty(input.Search)) { query = _patientRepository.GetQueryableAsync().Result .Where(x => x.Name.ToLower().Contains(input.Search.ToLower())) .OrderBy(input.Sorting ?? (nameof(Patient.Id) + " asc")) .Skip(input.SkipCount) .Take(input.MaxResultCount) .ToList(); } else { query = await _patientRepository.GetPagedListAsync( input.SkipCount, input.MaxResultCount, input.Sorting ?? nameof(Patient.Name) ); } var totalCount = await _patientRepository.CountAsync(); return new PagedResultDto( totalCount, ObjectMapper.Map, List>(query) ); } #endregion #region Get Single Patient by Id [Authorize(HospitalManagementSystemPermissions.Patient.Default)] public async Task GetPatientByIdAsync(Guid id) { var patient = await _patientRepository.GetAsync(id); return ObjectMapper.Map(patient); } #endregion #region Export Patient Data to Excel public async Task GetExportPatientDataAsync() { var patients = await _patientRepository.GetListAsync(); var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "exports"); if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); } var filename = "Patients_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx"; var filePath = Path.Combine(folderPath, filename); using (var workbook = new XLWorkbook()) { var worksheet = workbook.Worksheets.Add("Patients"); // Add headers worksheet.Cell(1, 1).Value = "Name"; worksheet.Cell(1, 2).Value = "Gender"; worksheet.Cell(1, 3).Value = "Age"; worksheet.Cell(1, 4).Value = "Treatment"; worksheet.Cell(1, 5).Value = "Doctor Assigned"; worksheet.Cell(1, 6).Value = "Admission Date"; worksheet.Cell(1, 7).Value = "Discharge Date"; worksheet.Cell(1, 8).Value = "Status"; // Add data rows for (int i = 0; i < patients.Count; i++) { worksheet.Cell(i + 2, 1).Value = patients[i].Name; worksheet.Cell(i + 2, 2).Value = patients[i].Gender.ToString(); worksheet.Cell(i + 2, 3).Value = patients[i].Age; worksheet.Cell(i + 2, 4).Value = patients[i].Treatment; worksheet.Cell(i + 2, 5).Value = patients[i].DoctorAssigned; worksheet.Cell(i + 2, 6).Value = patients[i].AdmissionDate.ToShortDateString(); worksheet.Cell(i + 2, 7).Value = patients[i].DischargeDate?.ToShortDateString(); worksheet.Cell(i + 2, 8).Value = patients[i].Status.ToString(); } worksheet.Columns().AdjustToContents(); workbook.SaveAs(filePath); } byte[] fileBytes = await File.ReadAllBytesAsync(filePath); File.Delete(filePath); return new FileDownloadDto { FileName = filename, FileContent = Convert.ToBase64String(fileBytes) }; } #endregion #region Create Patient [Authorize(HospitalManagementSystemPermissions.Patient.Create)] public async Task CreatePatientAsync(CreateUpdatePatientDto input) { var patient = ObjectMapper.Map(input); patient = await _patientRepository.InsertAsync(patient); return ObjectMapper.Map(patient); } #endregion #region Update Patient [Authorize(HospitalManagementSystemPermissions.Patient.Edit)] public async Task UpdatePatientAsync(Guid id, CreateUpdatePatientDto input) { var patient = await _patientRepository.GetAsync(id); ObjectMapper.Map(input, patient); patient = await _patientRepository.UpdateAsync(patient); return ObjectMapper.Map(patient); } #endregion #region Delete Patient [Authorize(HospitalManagementSystemPermissions.Patient.Delete)] public async Task DeletePatientAsync(Guid id) { await _patientRepository.DeleteAsync(id); } #endregion #endregion #region Get Status Dropdown public async Task> GetStatusDropdownAsync() { List statuslist = new List(); statuslist = Enum.GetValues(typeof(Status)) .Cast() .Select(e => new DropDownItems { Label = e.ToString(), Value = (int)e }) .ToList(); statuslist.Add(new DropDownItems { Label = "Select a Status", Value = 0 }); statuslist = statuslist.OrderBy(x => x.Value).ToList(); return await Task.FromResult(statuslist); } #endregion } }