initial commit
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
using Indotalent.ConfigBackEnd.Extensions;
|
||||
using Indotalent.Data.Entities;
|
||||
using Indotalent.Data.Enums;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Indotalent.Infrastructure.Database.Demo;
|
||||
|
||||
public static class MedicalRecordSeeder
|
||||
{
|
||||
public static async Task GenerateDataAsync(AppDbContext context)
|
||||
{
|
||||
if (await context.MedicalRecord.AnyAsync()) return;
|
||||
|
||||
var random = new Random();
|
||||
var entityName = nameof(MedicalRecord);
|
||||
|
||||
var patients = await context.Patient.ToListAsync();
|
||||
|
||||
var doctors = await context.Employee
|
||||
.Where(x => x.Name!.StartsWith("Dr.") || x.JobTitle!.Contains("Practitioner") || x.JobTitle!.Contains("Surgeon"))
|
||||
.ToListAsync();
|
||||
|
||||
var groups = await context.MedicalRecordGroup.ToListAsync();
|
||||
var categories = await context.MedicalRecordCategory.ToListAsync();
|
||||
|
||||
if (!patients.Any() || !doctors.Any() || !groups.Any() || !categories.Any()) return;
|
||||
|
||||
var soapSamples = new List<(string S, string O, string A, string P)>
|
||||
{
|
||||
(
|
||||
"Patient reports persistent lower back pain for 2 weeks, exacerbated by morning activity.",
|
||||
"Tenderness noted in the lumbar spine region, decreased range of motion during trunk flexion.",
|
||||
"Lumbago with sciatica (ICD-10 M54.5).",
|
||||
"Start NSAID regimen, referral to Physical Therapy twice weekly, and activity modification."
|
||||
),
|
||||
(
|
||||
"Dry cough and low-grade fever for 72 hours. Patient denies dyspnea or chest pain.",
|
||||
"Lungs clear to auscultation bilaterally. Pharynx mildly erythematous. Temp 100.8 F.",
|
||||
"Acute Upper Respiratory Infection (ICD-10 J06.9).",
|
||||
"Rest, increased fluid intake, and over-the-counter antipyretics as needed."
|
||||
),
|
||||
(
|
||||
"Routine dental evaluation. Patient reports sensitivity to cold stimuli on lower left quadrant.",
|
||||
"Localized enamel wear on tooth #19. Gingival tissue appears within normal limits.",
|
||||
"Dentin hypersensitivity (ICD-10 K03.8).",
|
||||
"Applied fluoride varnish. Recommended use of potassium nitrate toothpaste."
|
||||
),
|
||||
(
|
||||
"Follow-up for essential hypertension. Patient reports compliance with medication, no headaches.",
|
||||
"S1, S2 audible, regular rate and rhythm. No peripheral edema noted.",
|
||||
"Essential Hypertension (ICD-10 I10).",
|
||||
"Continue current antihypertensive therapy. Reinforce DASH diet and low sodium intake."
|
||||
),
|
||||
(
|
||||
"Urgent care visit: inverted right ankle while running this morning.",
|
||||
"Edema and ecchymosis over the lateral malleolus. Guarded weight-bearing due to pain.",
|
||||
"Ankle sprain, grade 1 (ICD-10 S93.4).",
|
||||
"Follow RICE protocol (Rest, Ice, Compression, Elevation). Applied ACE bandage."
|
||||
)
|
||||
};
|
||||
|
||||
var dateFinish = DateTime.Now;
|
||||
var dateStart = dateFinish.AddMonths(-12);
|
||||
|
||||
foreach (var patient in patients)
|
||||
{
|
||||
int recordsPerPatient = random.Next(1, 4);
|
||||
|
||||
for (int i = 0; i < recordsPerPatient; i++)
|
||||
{
|
||||
var randomDays = random.Next(0, (dateFinish - dateStart).Days);
|
||||
var recordDate = dateStart.AddDays(randomDays);
|
||||
var doctor = doctors[random.Next(doctors.Count)];
|
||||
var soap = soapSamples[random.Next(soapSamples.Count)];
|
||||
|
||||
var autoNo = await context.GenerateAutoNumberAsync(
|
||||
entityName: entityName,
|
||||
prefixTemplate: $"MR/{{Year}}/{{Month}}/"
|
||||
);
|
||||
|
||||
var tempF = Math.Round(97.0 + (random.NextDouble() * 3.5), 1);
|
||||
var heightInches = random.Next(60, 76);
|
||||
var feet = heightInches / 12;
|
||||
var inches = heightInches % 12;
|
||||
|
||||
var medicalRecord = new MedicalRecord
|
||||
{
|
||||
AutoNumber = autoNo,
|
||||
RecordDate = recordDate,
|
||||
PatientId = patient.Id,
|
||||
EmployeeId = doctor.Id,
|
||||
MedicalRecordGroupId = groups[random.Next(groups.Count)].Id,
|
||||
MedicalRecordCategoryId = categories[random.Next(categories.Count)].Id,
|
||||
|
||||
Subjective = soap.S,
|
||||
Objective = soap.O,
|
||||
Assessment = soap.A,
|
||||
Planning = soap.P,
|
||||
|
||||
BloodPressure = $"{random.Next(110, 135)}/{random.Next(70, 88)} mmHg",
|
||||
Temperature = $"{tempF} F",
|
||||
HeartRate = $"{random.Next(60, 100)} bpm",
|
||||
Weight = $"{random.Next(120, 230)} lbs",
|
||||
Height = $"{feet}'{inches}\"",
|
||||
|
||||
Description = $"Clinical encounter documentation for {patient.Name}",
|
||||
Status = random.Next(1, 10) > 2 ? MedicalRecordStatus.Completed : MedicalRecordStatus.Examining
|
||||
};
|
||||
|
||||
await context.MedicalRecord.AddAsync(medicalRecord);
|
||||
}
|
||||
}
|
||||
|
||||
await context.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user