97 lines
3.0 KiB
Go
97 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"math"
|
|
"math/rand"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const dataFile = "/data/chu_stats.json"
|
|
|
|
type CHUStats struct {
|
|
GeneratedAt time.Time `json:"generated_at"`
|
|
HospitalName string `json:"hospital_name"`
|
|
Date string `json:"date"`
|
|
BedsTotal int `json:"beds_total"`
|
|
BedsOccupied int `json:"beds_occupied"`
|
|
OccupancyRate float64 `json:"occupancy_rate"`
|
|
PatientsAdmitted int `json:"patients_admitted"`
|
|
PatientsDischarge int `json:"patients_discharged"`
|
|
EmergencyVisits int `json:"emergency_visits"`
|
|
AvgERWaitMinutes int `json:"avg_er_wait_minutes"`
|
|
SurgeriesPerformed int `json:"surgeries_performed"`
|
|
ICUBeds int `json:"icu_beds"`
|
|
ICUOccupied int `json:"icu_occupied"`
|
|
MortalityRate float64 `json:"mortality_rate"`
|
|
InfectionRate float64 `json:"infection_rate"`
|
|
StaffPresent int `json:"staff_present"`
|
|
StaffRequired int `json:"staff_required"`
|
|
PatientSatisfaction float64 `json:"patient_satisfaction"`
|
|
}
|
|
|
|
func round2(v float64) float64 {
|
|
return math.Round(v*100) / 100
|
|
}
|
|
|
|
func generateStats() CHUStats {
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
|
|
bedsTotal := 800 + rng.Intn(400)
|
|
occupancyPct := 0.65 + rng.Float64()*0.32
|
|
bedsOccupied := int(float64(bedsTotal) * occupancyPct)
|
|
|
|
icuBeds := 40 + rng.Intn(30)
|
|
icuOccupancyPct := 0.60 + rng.Float64()*0.38
|
|
icuOccupied := int(float64(icuBeds) * icuOccupancyPct)
|
|
|
|
staffRequired := 600 + rng.Intn(300)
|
|
staffCoverage := 0.65 + rng.Float64()*0.40
|
|
staffPresent := int(float64(staffRequired) * staffCoverage)
|
|
|
|
return CHUStats{
|
|
GeneratedAt: time.Now().UTC(),
|
|
HospitalName: "CHU Demo",
|
|
Date: time.Now().Format("2006-01-02"),
|
|
BedsTotal: bedsTotal,
|
|
BedsOccupied: bedsOccupied,
|
|
OccupancyRate: round2(occupancyPct * 100),
|
|
PatientsAdmitted: 50 + rng.Intn(120),
|
|
PatientsDischarge: 40 + rng.Intn(120),
|
|
EmergencyVisits: 80 + rng.Intn(150),
|
|
AvgERWaitMinutes: 15 + rng.Intn(130),
|
|
SurgeriesPerformed: 10 + rng.Intn(50),
|
|
ICUBeds: icuBeds,
|
|
ICUOccupied: icuOccupied,
|
|
MortalityRate: round2(0.3 + rng.Float64()*4.5),
|
|
InfectionRate: round2(0.5 + rng.Float64()*9.0),
|
|
StaffPresent: staffPresent,
|
|
StaffRequired: staffRequired,
|
|
PatientSatisfaction: round2(2.0 + rng.Float64()*3.0),
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
for i, stats := range []CHUStats{generateStats(), generateStats()} {
|
|
data, err := json.MarshalIndent(stats, "", " ")
|
|
if err != nil {
|
|
log.Fatalf("failed to marshal stats: %v", err)
|
|
}
|
|
|
|
if err := os.MkdirAll("/data", 0755); err != nil {
|
|
log.Fatalf("failed to create data dir: %v", err)
|
|
}
|
|
|
|
if err := os.WriteFile(strings.ReplaceAll(dataFile, "stats", "stats"+fmt.Sprintf("%v", i)), data, 0644); err != nil {
|
|
log.Fatalf("failed to write stats file: %v", err)
|
|
}
|
|
|
|
log.Printf("Stats saved to %s", dataFile)
|
|
fmt.Println(string(data))
|
|
}
|
|
}
|