348 lines
14 KiB
C#

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<PatientRecord, Guid> _patientrecordRepository;
private IRepository<Patient, Guid> _patientRepository;
public PatientAppService(IRepository<PatientRecord, Guid> patientrecordRepository, IRepository<Patient, Guid> patientRepository)
{
_patientrecordRepository = patientrecordRepository;
_patientRepository = patientRepository;
}
#region PatientRecord
#region Get Patient List with Paging and Searching
[Authorize(HospitalManagementSystemPermissions.Patient.Default)]
public async Task<PagedResultDto<PatientRecordDto>> GetPatientRecordListAsync(PagingSortPatientResultDto input, Guid Id)
{
//List<PatientRecord>? 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<PatientRecordDto>(
// totalCount,
// ObjectMapper.Map<List<PatientRecord>, List<PatientRecordDto>>(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<PatientRecordDto>(
totalCount,
ObjectMapper.Map<List<PatientRecord>, List<PatientRecordDto>>(pagedQuery)
);
}
#endregion
#region Get Single Patient by Id
[Authorize(HospitalManagementSystemPermissions.Patient.Default)]
public async Task<PatientRecordDto> GetPatientRecordByIdAsync(Guid id)
{
var patient = await _patientrecordRepository.GetAsync(id);
return ObjectMapper.Map<PatientRecord, PatientRecordDto>(patient);
}
#endregion
#region Export Patient Data to Excel
public async Task<FileDownloadDto> 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<PatientRecordDto> CreatePatientRecordAsync(CreateUpdatePatientRecordDto input)
{
var patientEntity = await _patientRepository.GetAsync(input.PatientId); // Get Patient from DB
var patientRecord = ObjectMapper.Map<CreateUpdatePatientRecordDto, PatientRecord>(input);
patientRecord.Patients = patientEntity; // Assign the fetched entity
patientRecord = await _patientrecordRepository.InsertAsync(patientRecord);
return ObjectMapper.Map<PatientRecord, PatientRecordDto>(patientRecord);
}
#endregion
#region Update Patient
[Authorize(HospitalManagementSystemPermissions.Patient.Edit)]
public async Task<PatientRecordDto> 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, PatientRecordDto>(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<PagedResultDto<PatientDto>> GetPatientListAsync(PagingSortPatientResultDto input)
{
List<Patient> 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<PatientDto>(
totalCount,
ObjectMapper.Map<List<Patient>, List<PatientDto>>(query)
);
}
#endregion
#region Get Single Patient by Id
[Authorize(HospitalManagementSystemPermissions.Patient.Default)]
public async Task<PatientDto> GetPatientByIdAsync(Guid id)
{
var patient = await _patientRepository.GetAsync(id);
return ObjectMapper.Map<Patient, PatientDto>(patient);
}
#endregion
#region Export Patient Data to Excel
public async Task<FileDownloadDto> 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<PatientDto> CreatePatientAsync(CreateUpdatePatientDto input)
{
var patient = ObjectMapper.Map<CreateUpdatePatientDto, Patient>(input);
patient = await _patientRepository.InsertAsync(patient);
return ObjectMapper.Map<Patient, PatientDto>(patient);
}
#endregion
#region Update Patient
[Authorize(HospitalManagementSystemPermissions.Patient.Edit)]
public async Task<PatientDto> UpdatePatientAsync(Guid id, CreateUpdatePatientDto input)
{
var patient = await _patientRepository.GetAsync(id);
ObjectMapper.Map(input, patient);
patient = await _patientRepository.UpdateAsync(patient);
return ObjectMapper.Map<Patient, PatientDto>(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<List<DropDownItems>> GetStatusDropdownAsync()
{
List<DropDownItems> statuslist = new List<DropDownItems>();
statuslist = Enum.GetValues(typeof(Status))
.Cast<Status>()
.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
}
}