package abnormal import ( "cpone-dashboard/menu/auth" "cpone-dashboard/menu/projects" "encoding/json" "html/template" "net/http" ) var tmpl *template.Template var basePath string func SetTemplates(t *template.Template) { tmpl = t } func SetBasePath(p string) { basePath = p } type pageData struct { Username string CurrentProject projects.ProjectItem Group string Groups []string Summary AbnormalSummary StaffJSON template.JS AgeJSON template.JS GenderJSON template.JS DeptJSON template.JS } func toJS(v any) template.JS { b, _ := json.Marshal(v) return template.JS(b) } func Index(w http.ResponseWriter, r *http.Request) { username := auth.Username(r) mcuID := auth.SelectedProjectID(r) if mcuID == 0 { http.Redirect(w, r, basePath+"/projects", http.StatusSeeOther) return } project, ok, err := projects.GetUserProject(username, mcuID) if err != nil || !ok { http.Redirect(w, r, basePath+"/projects", http.StatusSeeOther) return } group := r.URL.Query().Get("group") groups, err := GetAbnormalGroups(mcuID) if err != nil { http.Error(w, "query error", http.StatusInternalServerError) return } total, err := GetTotalPatients(mcuID) if err != nil { http.Error(w, "query error", http.StatusInternalServerError) return } abnormalCount, err := GetAbnormalCount(mcuID, group) if err != nil { http.Error(w, "query error", http.StatusInternalServerError) return } normalCount := total - abnormalCount if normalCount < 0 { normalCount = 0 } rate := 0 if total > 0 { rate = abnormalCount * 100 / total } ageData, err := GetAgeChartData(mcuID, group) if err != nil { http.Error(w, "query error", http.StatusInternalServerError) return } genderData, err := GetGenderChartData(mcuID, group) if err != nil { http.Error(w, "query error", http.StatusInternalServerError) return } deptData, err := GetDeptChartData(mcuID, group) if err != nil { http.Error(w, "query error", http.StatusInternalServerError) return } t := tmpl if t == nil { http.Error(w, "template not ready", http.StatusInternalServerError) return } if err := t.ExecuteTemplate(w, "base", pageData{ Username: username, CurrentProject: project, Group: group, Groups: groups, Summary: AbnormalSummary{ Total: total, Abnormal: abnormalCount, Normal: normalCount, AbnormalRate: rate, }, StaffJSON: toJS(map[string]any{ "normal": normalCount, "abnormal": abnormalCount, }), AgeJSON: toJS(map[string]any{ "labels": ageData.Labels, "abnormal": ageData.Abnormal, }), GenderJSON: toJS(map[string]any{ "labels": genderData.Labels, "abnormal": genderData.Abnormal, }), DeptJSON: toJS(map[string]any{ "labels": deptData.Labels, "abnormal": deptData.Abnormal, }), }); err != nil { http.Error(w, "template error", http.StatusInternalServerError) } }