348 lines
14 KiB
C#
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
|
|
}
|
|
}
|