package statistics_service import ( "XT_New/models" "XT_New/service" "fmt" "github.com/jinzhu/gorm" "strconv" "strings" ) func GetOrgFirstPatientInfo(user_org_id int64) (patient *models.Patients, err error) { db := service.XTReadDB() var tempPatient models.Patients findErr := db.Model(&models.Patients{}).Where("user_org_id = ? AND status = 1 AND lapseto = 1", user_org_id).Last(&tempPatient).Error if findErr == gorm.ErrRecordNotFound { return nil, nil } if findErr != nil { return nil, findErr } return &tempPatient, nil } type ProcessIndexDataStruct struct { Date string `json:"date"` Value float64 `json:"value"` } //透析过程统计 func GetDialysisProcessIndexChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (datas []*ProcessIndexDataStruct, err error) { db := service.XTReadDB() switch statistics_type { case 1: err = db.Raw("select from_unixtime(assessment_date,'%Y-%m-%d') as date, weight_before as value from xt_assessment_before_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 2: err = db.Raw("select from_unixtime(assessment_date,'%Y-%m-%d') as date, weight_after as value from xt_assessment_after_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 3: err = db.Raw("select from_unixtime(assessment_date,'%Y-%m-%d') as date, systolic_blood_pressure as value from xt_assessment_before_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 4: err = db.Raw("select from_unixtime(assessment_date,'%Y-%m-%d') as date, diastolic_blood_pressure as value from xt_assessment_before_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 5: err = db.Raw("select from_unixtime(assessment_date,'%Y-%m-%d') as date, pulse_frequency as value from xt_assessment_before_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 6: err = db.Raw("select from_unixtime(assessment_date,'%Y-%m-%d') as date, systolic_blood_pressure as value from xt_assessment_after_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 7: err = db.Raw("select from_unixtime(assessment_date,'%Y-%m-%d') as date, diastolic_blood_pressure as value from xt_assessment_after_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 8: err = db.Raw("select from_unixtime(assessment_date,'%Y-%m-%d') as date, pulse_frequency as value from xt_assessment_after_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break } if err != nil { return nil, err } return datas, nil } type otherItemAmount struct { Total int64 `json:"total"` Name string `json:"name"` Ratio string `json:"ratio"` } func GetDialysisProcessIndexOtherChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (item []*otherItemAmount, err error) { db := service.XTReadDB() var items []*otherItemAmount var tempErr error var total int64 switch statistics_type { case 9: tempErr = db.Table("xt_dialysis_prescription as p").Where("p.user_org_id=? and p.status=1 and p.created_time >= ? and p.created_time <= ? AND p.patient_id = ? ", user_org_id, start_time, end_time, patient_id). Select("CASE WHEN p.mode_id = 1 THEN 'HD'" + " WHEN p.mode_id = 2 THEN 'HDF'" + " WHEN p.mode_id = 3 THEN 'HD+HP'" + " WHEN p.mode_id = 4 THEN 'HP'" + " WHEN p.mode_id = 5 THEN 'HF'" + " WHEN p.mode_id = 6 THEN 'SCUF'" + " WHEN p.mode_id = 7 THEN 'IUF'" + " WHEN p.mode_id = 8 THEN 'HFHD'" + " WHEN p.mode_id = 9 THEN 'HFHD+HP'" + " WHEN p.mode_id = 10 THEN 'PHF'" + " WHEN p.mode_id = 11 THEN 'HFR'" + " WHEN p.mode_id = 12 THEN 'HDF+HP'" + " WHEN p.mode_id = 13 THEN 'CRRT'" + " WHEN p.mode_id = 14 THEN '腹水回输'" + " WHEN p.mode_id = 19 THEN 'IUF+HD'" + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("p.mode_id").Scan(&items).Error break case 10: config, _ := GetAnticoagulantData(user_org_id) selectContent := "CASE" for _, item := range config { fmt.Println(selectContent) selectContent = selectContent + " WHEN p.anticoagulant =" + strconv.Itoa(item.Value) + " THEN " + "'" + item.Name + "'" } fmt.Println(selectContent) tempErr = db.Table("xt_dialysis_prescription as p").Where("p.user_org_id=? and p.status=1 and p.created_time >= ? and p.created_time <= ? AND p.patient_id = ? ", user_org_id, start_time, end_time, patient_id). Select(selectContent + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("p.anticoagulant").Scan(&items).Error break } db.Table("xt_dialysis_prescription as p").Where("p.user_org_id=? AND p.status = 1 AND p.patient_id = ? AND p.created_time >= ? and p.created_time <= ? ", user_org_id, patient_id, start_time, end_time).Count(&total) for _, item := range items { float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", float64(item.Total)/float64(total)), 64) item.Ratio = strconv.FormatInt(int64(float_value*100), 10) } if tempErr != nil { return nil, err } return items, nil } type PatientDialysisRecord struct { models.VMSchedule DeviceNumber VMDeviceNumber `gorm:"foreignkey:ID;AssociationForeignKey:BedId;" json:"device_number"` DialysisPrescription VMDialysisPrescription `json:"prescription" gorm:"foreignkey:RecordDate;AssociationForeignKey:ScheduleDate;"` PredialysisEvaluation VMPredialysisEvaluation `json:"predialysis_evaluation" gorm:"foreignkey:AssessmentDate;AssociationForeignKey:ScheduleDate;"` AssessmentAfterDislysis models.AssessmentAfterDislysis `json:"assessment_after_dislysis" gorm:"foreignkey:AssessmentDate;AssociationForeignKey:ScheduleDate;"` Patient VMPatients `json:"patient" gorm:"foreignkey:ID;AssociationForeignKey:PatientID;"` } func GetDialysisProcessIndexTableData(orgID, patientID int64, page, limit, start, end int64) ([]*PatientDialysisRecord, int64, error) { offset := (page - 1) * limit var total int64 var err error var orders []*PatientDialysisRecord readDb := service.XTReadDB() db := readDb.Table("xt_schedule as sch"). Preload("DeviceNumber", "org_id=? and status=1", orgID). Preload("DialysisPrescription", "patient_id=? and user_org_id=? and status=1", patientID, orgID). Preload("PredialysisEvaluation", "patient_id=? and user_org_id=? and status=1", patientID, orgID). Preload("AssessmentAfterDislysis", "patient_id=? and user_org_id=? and status=1", patientID, orgID). Preload("Patient", "user_org_id=? and status=1", orgID). Where("sch.patient_id=? and sch.user_org_id=? and sch.status=1", patientID, orgID).Group("sch.schedule_date") if start != 0 { db = db.Where("sch.schedule_date>=?", start) } if end != 0 { db = db.Where("sch.schedule_date<=?", end) } err = db.Count(&total).Offset(offset).Limit(limit).Order("sch.schedule_date desc").Select("sch.patient_id,sch.schedule_date,sch.bed_id,sch.user_org_id").Find(&orders).Error return orders, total, err } func GetAnticoagulantData(user_org_id int64) (config []*models.Dataconfig, tempErr error) { var tempDataConfig []*models.Dataconfig var tempConfig models.Dataconfig db := service.XTReadDB() db.Model(&models.Dataconfig{}).Where("name = '抗凝剂' AND field_name = 'anticoagulant' AND parent_id = 0").First(&tempConfig) err := db.Model(&models.Dataconfig{}).Where("(org_id = 0 OR org_id = ?) AND parent_id = ?", user_org_id, tempConfig.ID).Find(&tempDataConfig).Error return tempDataConfig, err } //透析过程统计 //透析监测统计 func GetDialysisWatchChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (datas []*ProcessIndexDataStruct, err error) { db := service.XTReadDB() switch statistics_type { case 1: if patient_id == 0 { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.systolic_blood_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.systolic_blood_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break case 2: if patient_id == 0 { //err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.systolic_blood_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.diastolic_blood_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { //err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.systolic_blood_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.diastolic_blood_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break case 3: if patient_id == 0 { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.pulse_frequency as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.pulse_frequency as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break case 4: if patient_id == 0 { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.breathing_rate as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.breathing_rate as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break case 5: if patient_id == 0 { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.temperature as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.temperature as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break case 6: if patient_id == 0 { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.blood_flow_volume as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.blood_flow_volume as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break case 7: if patient_id == 0 { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.venous_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.venous_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break case 8: if patient_id == 0 { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.arterial_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.arterial_pressure as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break case 9: if patient_id == 0 { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.ultrafiltration_rate as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, end_time, start_time).Scan(&datas).Error } else { err = db.Raw("select from_unixtime(monitor.operate_time,'%Y-%m-%d %H:%i') as date, monitor.ultrafiltration_rate as value from xt_monitoring_record as monitor Where status = 1 AND user_org_id = ? AND patient_id = ? AND operate_time <= ? AND operate_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error } break } if err != nil { return nil, err } return datas, nil } func GetDialysisWatchTableData(orgID, patientID int64, page, limit, start, end int64) ([]*VMMonitoringRecord, int64, error) { offset := (page - 1) * limit var total int64 var err error var orders []*VMMonitoringRecord readDb := service.XTReadDB() db := readDb.Table("xt_monitoring_record as mo"). Where(" mo.user_org_id=? and mo.status=1", orgID) if patientID != 0 { db = db.Where("mo.patient_id =?", patientID) } if start != 0 { db = db.Where("mo.operate_time>=?", start) } if end != 0 { db = db.Where("mo.operate_time<=?", end) } err = db.Count(&total).Offset(offset).Limit(limit).Order("mo.operate_time desc").Select("mo.patient_id,mo.operate_time,mo.systolic_blood_pressure, mo.diastolic_blood_pressure, mo.pulse_frequency,mo.breathing_rate,mo.temperature,mo.blood_flow_volume,mo.venous_pressure,mo.arterial_pressure,mo.transmembrane_pressure,mo.dialysate_temperature,mo.ultrafiltration_rate,mo.ultrafiltration_volume").Find(&orders).Error return orders, total, err } //透析监测统计 //透析体重统计 func GetDialysisWeightChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int) (item []*otherItemAmount, err error) { db := service.XTReadDB() var items []*otherItemAmount var tempErr error //var total int64 switch statistics_type { case 1: tempErr = db.Table("xt_assessment_before_dislysis ").Where("user_org_id=? and status=1 and created_time >= ? and created_time <= ?", user_org_id, start_time, end_time). Select("CASE WHEN dry_weight < 40 THEN '小于40kg'" + " WHEN dry_weight >= 40 AND dry_weight < 50 THEN '40~50kg'" + " WHEN dry_weight >= 50 AND dry_weight < 60 THEN '50~60kg'" + " WHEN dry_weight >= 60 AND dry_weight < 70 THEN '60~70kg'" + " WHEN dry_weight >= 70 THEN '大于70kg'" + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("name").Scan(&items).Error var isHasConditionOne bool = false var isHasConditionTwo bool = false var isHasConditionThree bool = false var isHasConditionFour bool = false var isHasConditionFive bool = false for _, item := range items { if item.Name == "小于40kg" { isHasConditionOne = true } if item.Name == "40~50kg" { isHasConditionTwo = true } if item.Name == "60~70kg" { isHasConditionThree = true } if item.Name == "大于70kg" { isHasConditionFour = true } if item.Name == "未知" { isHasConditionFive = true } } if !isHasConditionOne { newItem := &otherItemAmount{ Total: 0, Name: "小于40kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionTwo { newItem := &otherItemAmount{ Total: 0, Name: "40~50kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionThree { newItem := &otherItemAmount{ Total: 0, Name: "60~70kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionFour { newItem := &otherItemAmount{ Total: 0, Name: "大于70kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionFive { newItem := &otherItemAmount{ Total: 0, Name: "未知", Ratio: "0", } items = append(items, newItem) } break case 2: tempErr = db.Table("xt_assessment_before_dislysis").Where("user_org_id=? and status=1 and created_time >= ? and created_time <= ?", user_org_id, start_time, end_time). Select("CASE WHEN weight_before < 40 THEN '小于40kg'" + " WHEN weight_before >= 40 AND weight_before < 50 THEN '40~50kg'" + " WHEN weight_before >= 50 AND weight_before < 60 THEN '50~60kg'" + " WHEN weight_before >= 60 AND weight_before < 70 THEN '60~70kg'" + " WHEN weight_before >= 70 THEN '大于70kg'" + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("name").Scan(&items).Error var isHasConditionOne bool = false var isHasConditionTwo bool = false var isHasConditionThree bool = false var isHasConditionFour bool = false var isHasConditionFive bool = false for _, item := range items { if item.Name == "小于40kg" { isHasConditionOne = true } if item.Name == "40~50kg" { isHasConditionTwo = true } if item.Name == "60~70kg" { isHasConditionThree = true } if item.Name == "大于70kg" { isHasConditionFour = true } if item.Name == "未知" { isHasConditionFive = true } } if !isHasConditionOne { newItem := &otherItemAmount{ Total: 0, Name: "小于40kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionTwo { newItem := &otherItemAmount{ Total: 0, Name: "40~50kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionThree { newItem := &otherItemAmount{ Total: 0, Name: "60~70kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionFour { newItem := &otherItemAmount{ Total: 0, Name: "大于70kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionFive { newItem := &otherItemAmount{ Total: 0, Name: "未知", Ratio: "0", } items = append(items, newItem) } break case 3: type weight struct { WeightAfter float64 `json:"weight_after"` WeightBefore float64 `json:"weight_before"` } var weights []*weight var weightAdd []float64 db.Raw("Select xt_assessment_after_dislysis.weight_after as weight_after ,xt_assessment_before_dislysis.weight_before as weight_before from `xt_assessment_before_dislysis` LEFT JOIN `xt_assessment_after_dislysis` On xt_assessment_before_dislysis.`patient_id` = xt_assessment_after_dislysis.`patient_id` AND xt_assessment_before_dislysis.assessment_date = xt_assessment_after_dislysis.assessment_date AND xt_assessment_after_dislysis.weight_after != 0 Where xt_assessment_before_dislysis.user_org_id = ? AND xt_assessment_before_dislysis.created_time >= ? AND xt_assessment_before_dislysis.created_time <= ? Order by xt_assessment_before_dislysis.assessment_date desc", user_org_id, start_time, end_time).Scan(&weights) for index, _ := range weights { if index+1 < len(weights) { if weights[index+1].WeightAfter == 0 || weights[index].WeightBefore == 0 { continue } weightAdd = append(weightAdd, weights[index].WeightBefore-weights[index+1].WeightAfter) } } var total_one int64 var total_two int64 var total_three int64 var total_four int64 var total_five int64 for _, item := range weightAdd { if item < 1 { total_one++ fmt.Println(total_one) } if item >= 1 && item < 2 { total_two++ fmt.Println(total_two) } if item >= 2 && item < 3 { total_three++ fmt.Println(total_three) } if item >= 3 && item <= 4 { total_four++ fmt.Println(total_four) } if item > 4 { total_five++ fmt.Println(total_five) } } newItem := &otherItemAmount{ Total: total_one, Name: "小于1kg", Ratio: "0", } newItem1 := &otherItemAmount{ Total: total_two, Name: "1-2kg", Ratio: "0", } newItem2 := &otherItemAmount{ Total: total_three, Name: "2-3kg", Ratio: "0", } newItem3 := &otherItemAmount{ Total: total_four, Name: "3-4kg", Ratio: "0", } newItem4 := &otherItemAmount{ Total: total_five, Name: "大于4kg", Ratio: "0", } items = append(items, newItem) items = append(items, newItem1) items = append(items, newItem2) items = append(items, newItem3) items = append(items, newItem4) break case 4: tempErr = db.Table("xt_assessment_after_dislysis").Where("user_org_id=? and status=1 and created_time >= ? and created_time <= ?", user_org_id, start_time, end_time). Select("CASE WHEN weight_after < 40 THEN '小于40kg'" + " WHEN weight_after >= 40 AND weight_after < 50 THEN '40~50kg'" + " WHEN weight_after >= 50 AND weight_after < 60 THEN '50~60kg'" + " WHEN weight_after >= 60 AND weight_after < 70 THEN '60~70kg'" + " WHEN weight_after >= 70 THEN '大于70kg'" + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("name").Scan(&items).Error var isHasConditionOne bool = false var isHasConditionTwo bool = false var isHasConditionThree bool = false var isHasConditionFour bool = false var isHasConditionFive bool = false for _, item := range items { if item.Name == "小于40kg" { isHasConditionOne = true } if item.Name == "40~50kg" { isHasConditionTwo = true } if item.Name == "60~70kg" { isHasConditionThree = true } if item.Name == "大于70kg" { isHasConditionFour = true } if item.Name == "未知" { isHasConditionFive = true } } if !isHasConditionOne { newItem := &otherItemAmount{ Total: 0, Name: "小于40kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionTwo { newItem := &otherItemAmount{ Total: 0, Name: "40~50kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionThree { newItem := &otherItemAmount{ Total: 0, Name: "60~70kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionFour { newItem := &otherItemAmount{ Total: 0, Name: "大于70kg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionFive { newItem := &otherItemAmount{ Total: 0, Name: "未知", Ratio: "0", } items = append(items, newItem) } break } if tempErr != nil { return nil, err } fmt.Println(items) return items, nil } func GetDialysisWeightTableData(orgID, patientID int64, page, limit, start, end int64) ([]*VMPredialysisEvaluation, int64, error) { offset := (page - 1) * limit var total int64 var err error var orders []*VMPredialysisEvaluation readDb := service.XTReadDB() db := readDb.Table("xt_assessment_before_dislysis") db = db.Where(" user_org_id=? and status=1", orgID) if patientID > 0 { db = db.Where("patient_id=?", patientID) } if start != 0 { db = db.Where("assessment_date>=?", start) } if end != 0 { db = db.Where("assessment_date<=?", end) } db = db.Preload("VMAssessmentAfterDislysis", "status = 1 AND user_org_id = ?", orgID).Preload("VMPatients", "status = 1 AND user_org_id = ?", orgID) err = db.Count(&total).Offset(offset).Limit(limit).Order("assessment_date desc").Select("dry_weight, weight_before, patient_id, assessment_date").Find(&orders).Error for _, item := range orders { after, _ := GetLastAfterWeight(orgID, item.AssessmentDate, item.PatientId) if after.ID > 0 { fmt.Println(after.WeightAfter) item.LastAfterWeight = after.WeightAfter } } return orders, total, err } type LastAfter struct { ID int64 `json:"id"` WeightAfter float64 `json:"weight_after"` } func GetLastAfterWeight(user_org_id int64, before_assessment_date int64, patient_id int64) (after LastAfter, err error) { readDb := service.XTReadDB() err = readDb.Raw("SELECT weight_after as weight_after,id as id from xt_assessment_after_dislysis WHERE (user_org_id = ? AND patient_id = ? AND assessment_date < ?) ORDER BY id desc,`xt_assessment_after_dislysis`.`id` ASC LIMIT 1 ", user_org_id, patient_id, before_assessment_date).Scan(&after).Error return } func GetPatientDialysisWeightChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (datas []*ProcessIndexDataStruct, err error) { db := service.XTReadDB() switch statistics_type { case 1: err = db.Raw("select from_unixtime(assessment_date, '%Y-%m-%d') as date, dry_weight as value from xt_assessment_before_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 2: err = db.Raw("select from_unixtime(assessment_date, '%Y-%m-%d') as date, weight_before as value from xt_assessment_before_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 3: type weight struct { WeightAfter float64 `json:"weight_after"` WeightBefore float64 `json:"weight_before"` Date string `json:"date"` } var weights []*weight db.Raw("Select xt_assessment_after_dislysis.weight_after as weight_after ,xt_assessment_before_dislysis.weight_before as weight_before,from_unixtime(xt_assessment_before_dislysis.assessment_date,'%Y-%m-%d') as date from `xt_assessment_before_dislysis` LEFT JOIN `xt_assessment_after_dislysis` On xt_assessment_before_dislysis.`patient_id` = xt_assessment_after_dislysis.`patient_id` AND xt_assessment_before_dislysis.assessment_date = xt_assessment_after_dislysis.assessment_date AND xt_assessment_after_dislysis.weight_after != 0 Where xt_assessment_before_dislysis.user_org_id = ? AND xt_assessment_before_dislysis.created_time >= ? AND xt_assessment_before_dislysis.created_time <= ? AND xt_assessment_before_dislysis.patient_id = ? Order by date desc", user_org_id, start_time, end_time, patient_id).Scan(&weights) fmt.Println(len(weights)) for index, _ := range weights { if index+1 < len(weights) { var weight_add ProcessIndexDataStruct fmt.Println(weights[index+1].WeightAfter) fmt.Println(weights[index].WeightBefore) if weights[index+1].WeightAfter == 0 || weights[index].WeightBefore == 0 { continue } add := weights[index].WeightBefore - weights[index+1].WeightAfter weight_add.Value = add weight_add.Date = weights[index].Date datas = append(datas, &weight_add) } } break case 4: err = db.Raw("select from_unixtime(assessment_date, '%Y-%m-%d') as date, weight_after as value from xt_assessment_after_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break } if err != nil { return nil, err } return datas, nil } //透析体重统计 //透析血压统计 func GetBloodPressureChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int, patient_id int64) (item []*otherItemAmount, err error) { db := service.XTReadDB() var items []*otherItemAmount var tempErr error var Total int64 switch statistics_type { case 1: type bp struct { SystolicBloodPressure float64 `json:"systolic_blood_pressure"` DiastolicBloodPressure float64 `json:"diastolic_blood_pressure"` } var bps []*bp if patient_id == 0 { db.Raw("SELECT systolic_blood_pressure,diastolic_blood_pressure FROM xt_assessment_before_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? UNION ALL SELECT systolic_blood_pressure,diastolic_blood_pressure FROM xt_assessment_after_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? ", user_org_id, start_time, end_time, user_org_id, start_time, end_time).Scan(&bps) //db.Raw("SELECT count(id) FROM xt_assessment_before_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? UNION ALL SELECT systolic_blood_pressure,diastolic_blood_pressure FROM xt_assessment_after_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? ", user_org_id, start_time, end_time, user_org_id, start_time, end_time).Count(&Total) } else { db.Raw("SELECT systolic_blood_pressure,diastolic_blood_pressure FROM xt_assessment_before_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? AND patient_id = ? UNION ALL SELECT systolic_blood_pressure,diastolic_blood_pressure FROM xt_assessment_after_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? AND patient_id = ? ", user_org_id, start_time, end_time, patient_id, user_org_id, start_time, end_time, patient_id).Scan(&bps) //db.Raw("SELECT count(id) FROM xt_assessment_before_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? AND patient_id = ? UNION ALL SELECT systolic_blood_pressure,diastolic_blood_pressure FROM xt_assessment_after_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? AND patient_id = ? ", user_org_id, start_time, end_time, patient_id, user_org_id, start_time, end_time, patient_id).Count(&Total) } var total_one int64 var total_two int64 var total_three int64 var total_four int64 for _, item := range bps { if item.SystolicBloodPressure > 160 && item.DiastolicBloodPressure > 100 { total_one++ } else if item.SystolicBloodPressure < 140 && item.DiastolicBloodPressure < 99 { total_two++ } else if item.SystolicBloodPressure >= 100 && item.SystolicBloodPressure <= 160 && item.DiastolicBloodPressure >= 99 && item.DiastolicBloodPressure <= 140 { total_three++ } else { fmt.Println(item.SystolicBloodPressure) fmt.Println(item.DiastolicBloodPressure) total_four++ } } newItem := &otherItemAmount{ Total: total_one, Name: "大于160/100mmHg", Ratio: "0", } newItem1 := &otherItemAmount{ Total: total_two, Name: "小于140/99mmHg", Ratio: "0", } newItem2 := &otherItemAmount{ Total: total_three, Name: "140-160mmHg/90-100mmHg", Ratio: "0", } newItem3 := &otherItemAmount{ Total: total_four, Name: "其他", Ratio: "0", } items = append(items, newItem) items = append(items, newItem1) items = append(items, newItem2) items = append(items, newItem3) // //for _, item := range items { // float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", float64(item.Total)/float64(Total)), 64) // item.Ratio = strconv.FormatInt(int64(float_value*100), 10) //} break case 2: if patient_id == 0 { tempErr = db.Table("xt_assessment_before_dislysis ").Where("user_org_id=? and status=1 and created_time >= ? and created_time <= ? ", user_org_id, start_time, end_time). Select("CASE WHEN systolic_blood_pressure > 160 AND diastolic_blood_pressure > 100 THEN '大于160/100mmHg'" + " WHEN systolic_blood_pressure < 140 AND diastolic_blood_pressure < 99 THEN '小于140/99mmHg'" + " WHEN systolic_blood_pressure >= 140 AND systolic_blood_pressure >= 160 AND diastolic_blood_pressure >= 99 AND diastolic_blood_pressure <= 140 THEN '140-160mmHg/90-100mmHg'" + " ELSE '其他' END AS name, COUNT(*) AS total", ).Scan(&items).Group("name").Error } else { tempErr = db.Table("xt_assessment_before_dislysis ").Where("user_org_id=? and status=1 and created_time >= ? and created_time <= ? and patient_id = ? ", user_org_id, start_time, end_time, patient_id). Select("CASE WHEN systolic_blood_pressure > 160 AND diastolic_blood_pressure > 100 THEN '大于160/100mmHg'" + " WHEN systolic_blood_pressure < 140 AND diastolic_blood_pressure < 99 THEN '小于140/99mmHg'" + " WHEN systolic_blood_pressure >= 140 AND systolic_blood_pressure >= 160 AND diastolic_blood_pressure >= 99 AND diastolic_blood_pressure <= 140 THEN '140-160mmHg/90-100mmHg'" + " ELSE '其他' END AS name, COUNT(*) AS total", ).Scan(&items).Group("name").Error } //db.Table("xt_assessment_before_dislysis as before").Where("before.user_org_id=? AND before.status = 1 AND before.created_time >= ? and before.created_time <= ? ", user_org_id, patient_id, start_time, end_time).Count(&total) var isHasConditionOne bool = false var isHasConditionTwo bool = false var isHasConditionThree bool = false for _, item := range items { if item.Name == "大于160/100mmHg" { isHasConditionOne = true } if item.Name == "小于140/99mmHg" { isHasConditionTwo = true } if item.Name == "140-160mmHg/90-100mmHg" { isHasConditionThree = true } } if !isHasConditionOne { newItem := &otherItemAmount{ Total: 0, Name: "大于160/100mmHg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionTwo { newItem := &otherItemAmount{ Total: 0, Name: "小于140/99mmHg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionThree { newItem := &otherItemAmount{ Total: 0, Name: "140-160mmHg/90-100mmHg", Ratio: "0", } items = append(items, newItem) } break case 3: if patient_id == 0 { tempErr = db.Table("xt_assessment_after_dislysis ").Where("user_org_id=? and status=1 and created_time >= ? and created_time <= ? ", user_org_id, start_time, end_time). Select("CASE WHEN systolic_blood_pressure > 160 AND diastolic_blood_pressure > 100 THEN '大于160/100mmHg'" + " WHEN systolic_blood_pressure < 140 AND diastolic_blood_pressure < 99 THEN '小于140/99mmHg'" + " WHEN systolic_blood_pressure >= 140 AND systolic_blood_pressure >= 160 AND diastolic_blood_pressure >= 99 AND diastolic_blood_pressure <= 140 THEN '140-160mmHg/90-100mmHg'" + " ELSE '其他' END AS name, COUNT(*) AS total", ).Scan(&items).Group("name").Error } else { tempErr = db.Table("xt_assessment_after_dislysis ").Where("user_org_id=? and status=1 and created_time >= ? and created_time <= ? and patient_id = ?", user_org_id, start_time, end_time, patient_id). Select("CASE WHEN systolic_blood_pressure > 160 AND diastolic_blood_pressure > 100 THEN '大于160/100mmHg'" + " WHEN systolic_blood_pressure < 140 AND diastolic_blood_pressure < 99 THEN '小于140/99mmHg'" + " WHEN systolic_blood_pressure >= 140 AND systolic_blood_pressure >= 160 AND diastolic_blood_pressure >= 99 AND diastolic_blood_pressure <= 140 THEN '140-160mmHg/90-100mmHg'" + " ELSE '其他' END AS name, COUNT(*) AS total", ).Scan(&items).Group("name").Error } var isHasConditionOne bool = false var isHasConditionTwo bool = false var isHasConditionThree bool = false for _, item := range items { if item.Name == "大于160/100mmHg" { isHasConditionOne = true } if item.Name == "小于140/99mmHg" { isHasConditionTwo = true } if item.Name == "140-160mmHg/90-100mmHg" { isHasConditionThree = true } } if !isHasConditionOne { newItem := &otherItemAmount{ Total: 0, Name: "大于160/100mmHg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionTwo { newItem := &otherItemAmount{ Total: 0, Name: "小于140/99mmHg", Ratio: "0", } items = append(items, newItem) } if !isHasConditionThree { newItem := &otherItemAmount{ Total: 0, Name: "140-160mmHg/90-100mmHg", Ratio: "0", } items = append(items, newItem) } break } if tempErr != nil { return nil, err } return items, nil } func GetBloodPressureTableData(orgID, patientID int64, page, limit, start, end int64) ([]*VMSchedule, int64, error) { offset := (page - 1) * limit var total int64 var err error var orders []*VMSchedule readDb := service.XTReadDB() db := readDb.Table("xt_schedule as sch") db = db.Where(" sch.user_org_id=? and sch.status=1", orgID) if patientID > 0 { db = db.Where("sch.patient_id=?", patientID) } if start != 0 { db = db.Where("sch.created_time>=?", start) } if end != 0 { db = db.Where("sch.created_time<=?", end) } db = db.Preload("VMPredialysisEvaluation", "status = 1 AND user_org_id = ?", orgID). Preload("VMAssessmentAfterDislysis", "status = 1 AND user_org_id = ?", orgID). Preload("VMMinMonitoringRecord", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1 AND user_org_id = ?", orgID).Order("systolic_blood_pressure DESC") }). Preload("VMMaxMonitoringRecord", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1 AND user_org_id = ?", orgID).Order("systolic_blood_pressure ASC") }). Preload("VMPatients", "status = 1 AND user_org_id = ?", orgID) err = db.Count(&total).Offset(offset).Limit(limit).Order("sch.schedule_date desc").Select(" sch.schedule_date,sch.patient_id,sch.user_org_id").Find(&orders).Error return orders, total, err } type BPDataStruct struct { Date string `json:"date"` SystolicBloodPressure float64 `json:"systolic_blood_pressure"` DiastolicBloodPressure float64 `json:"diastolic_blood_pressure"` } func GetPatientBloodPressureChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (datas []*BPDataStruct, err error) { fmt.Println("8u8923u213u8129") db := service.XTReadDB() switch statistics_type { case 1: err = db.Raw("select from_unixtime(assessment_date, '%Y-%m-%d') as date, systolic_blood_pressure as systolic_blood_pressure, diastolic_blood_pressure as diastolic_blood_pressure from xt_assessment_before_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break case 2: err = db.Raw("select from_unixtime(assessment_date, '%Y-%m-%d') as date, systolic_blood_pressure as systolic_blood_pressure, diastolic_blood_pressure as diastolic_blood_pressure from xt_assessment_after_dislysis Where status = 1 AND user_org_id = ? AND patient_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, end_time, start_time).Scan(&datas).Error break } if err != nil { return nil, err } return datas, nil } //透析血压统计 //工作量统计 func GetDoctorWorkloadChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int) (datas []*VMUserAdminRole, err error) { userDb := service.UserReadDB() db := service.XTReadDB() userDb.Raw("select admin_user_id, user_name,org_id from sgj_user_admin_role Where status = 1 AND org_id = ? AND user_type = 2 ", user_org_id).Scan(&datas) switch statistics_type { case 1: for _, item := range datas { var total int64 db.Table("xt_dialysis_prescription as p").Where("user_org_id = ? AND status = 1 AND prescription_doctor = ? AND created_time >= ? AND created_time <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&total) item.PCount = total } break case 2: for _, item := range datas { var total int64 db.Table("xt_patient_course_of_disease as course").Where("org_id = ? AND status = 1 AND recorder = ? AND ctime >= ? AND ctime <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&total) item.CourseCount = total } break case 3: for _, item := range datas { var total int64 db.Table("xt_patient_rescue_record as rescue").Where("org_id = ? AND status = 1 AND recorder = ? AND ctime >= ? AND ctime <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&total) item.RescueCount = total } break } if err != nil { return nil, err } fmt.Println(datas) return datas, nil } func GetDoctorWorkloadTableData(user_org_id int64, start_time int64, end_time int64, admin_user_id int64) (datas []*VMUserAdminRole, err error) { userDb := service.UserReadDB() db := service.XTReadDB() if admin_user_id == 0 { userDb.Raw("select admin_user_id, user_name,org_id from sgj_user_admin_role Where status = 1 AND org_id = ? AND user_type = 2 ", user_org_id).Scan(&datas) } else { userDb.Raw("select admin_user_id, user_name,org_id from sgj_user_admin_role Where status = 1 AND org_id = ? AND user_type = 2 AND admin_user_id = ?", user_org_id, admin_user_id).Scan(&datas) } for _, item := range datas { var Total int64 var TotalOne int64 var TotalTwo int64 db.Table("xt_dialysis_prescription as p").Where("user_org_id = ? AND status = 1 AND prescription_doctor = ? AND created_time >= ? AND created_time <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&Total) db.Table("xt_patient_course_of_disease as course").Where("org_id = ? AND status = 1 AND recorder = ? AND ctime >= ? AND ctime <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&TotalOne) db.Table("xt_patient_rescue_record as rescue").Where("org_id = ? AND status = 1 AND recorder = ? AND ctime >= ? AND ctime <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&TotalTwo) item.PCount = Total item.CourseCount = TotalOne item.RescueCount = TotalTwo } if err != nil { return nil, err } return datas, nil } func GetNurseWorkloadChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int) (datas []*VMUserAdminRole, err error) { userDb := service.UserReadDB() db := service.XTReadDB() userDb.Raw("select admin_user_id, user_name,org_id from sgj_user_admin_role Where status = 1 AND org_id = ? AND user_type = 3 ", user_org_id).Scan(&datas) var tempConfig models.Dataconfig db.Model(&models.Dataconfig{}).Where("name = '血管通路' AND module = 'hemodialysis' AND field_name = 'vascular_access_desc' AND parent_id = 0").First(&tempConfig) switch statistics_type { case 1: for _, item := range datas { var Total int64 db.Raw("select count(*) as total from (select d.patient_id as patient, d.id, d.`assessment_date` as date,config.name as name from xt_assessment_before_dislysis as d JOIN `xt_data_config` config on d.`blood_access_part_opera_id` = config.value AND config.org_id = ? AND config.parent_id = ? AND FIND_IN_SET('内瘘',config.name) > 0 Group by d.id) b JOIN `xt_dialysis_order` on xt_dialysis_order.`dialysis_date` = b.date AND xt_dialysis_order.user_org_id = ? AND xt_dialysis_order.status = 1 AND xt_dialysis_order.start_nurse = ? AND xt_dialysis_order.created_time >= ? AND xt_dialysis_order.created_time <= ? ", user_org_id, tempConfig.ID, user_org_id, item.AdminUserId, start_time, end_time).Count(&Total) item.PunctureCount = Total } break case 2: for _, item := range datas { var Total int64 db.Raw("select count(*) as total from (select d.patient_id as patient, d.id, d.`assessment_date` as date,config.name as name from xt_assessment_before_dislysis as d JOIN `xt_data_config` config on d.`blood_access_part_opera_id` = config.value AND config.org_id = ? AND config.parent_id = ? AND FIND_IN_SET('导管',config.name) > 0 Group by d.id) b JOIN `xt_dialysis_order` on xt_dialysis_order.`dialysis_date` = b.date AND xt_dialysis_order.user_org_id = ? AND xt_dialysis_order.status = 1 AND xt_dialysis_order.start_nurse = ? AND xt_dialysis_order.created_time >= ? AND xt_dialysis_order.created_time <= ? ", user_org_id, tempConfig.ID, user_org_id, item.AdminUserId, start_time, end_time).Count(&Total) item.ChangemedicineCount = Total } break case 3: for _, item := range datas { var total int64 db.Table("xt_monitoring_record").Where("user_org_id = ? AND status = 1 AND monitoring_nurse = ? AND created_time >= ? AND created_time <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&total) item.CureCount = total } break case 4: for _, item := range datas { var Total int64 db.Table("xt_treatment_summary ").Where("user_org_id = ? AND status = 1 AND creater = ? AND created_time >= ? AND created_time <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&Total) item.MissionCount = Total } break } if err != nil { return nil, err } return datas, nil } func GetNurseWorkloadTableData(user_org_id int64, start_time int64, end_time int64, admin_user_id int64) (datas []*VMUserAdminRole, err error) { userDb := service.UserReadDB() db := service.XTReadDB() var tempConfig models.Dataconfig db.Model(&models.Dataconfig{}).Where("name = '血管通路' AND module = 'hemodialysis' AND field_name = 'vascular_access_desc' AND parent_id = 0").First(&tempConfig) if admin_user_id == 0 { userDb.Raw("select admin_user_id, user_name,org_id from sgj_user_admin_role Where status = 1 AND org_id = ? AND user_type = 3 ", user_org_id).Scan(&datas) } else { userDb.Raw("select admin_user_id, user_name,org_id from sgj_user_admin_role Where status = 1 AND org_id = ? AND user_type = 3 AND admin_user_id = ?", user_org_id, admin_user_id).Scan(&datas) } for _, item := range datas { var Total int64 var TotalOne int64 var TotalTwo int64 var TotalThree int64 db.Raw("select count(*) as total from (select d.patient_id as patient, d.id, d.`assessment_date` as date,config.name as name from xt_assessment_before_dislysis as d JOIN `xt_data_config` config on d.`blood_access_part_opera_id` = config.value AND config.org_id = ? AND config.parent_id = ? AND FIND_IN_SET('内瘘',config.name) > 0 Group by d.id) b JOIN `xt_dialysis_order` on xt_dialysis_order.`dialysis_date` = b.date AND xt_dialysis_order.user_org_id = ? AND xt_dialysis_order.status = 1 AND xt_dialysis_order.start_nurse = ? AND xt_dialysis_order.created_time >= ? AND xt_dialysis_order.created_time <= ? ", user_org_id, tempConfig.ID, user_org_id, item.AdminUserId, start_time, end_time).Count(&Total) db.Raw("select count(*) as total_one from (select d.patient_id as patient, d.id, d.`assessment_date` as date,config.name as name from xt_assessment_before_dislysis as d JOIN `xt_data_config` config on d.`blood_access_part_opera_id` = config.value AND config.org_id = ? AND config.parent_id = ? AND FIND_IN_SET('导管',config.name) > 0 Group by d.id) b JOIN `xt_dialysis_order` on xt_dialysis_order.`dialysis_date` = b.date AND xt_dialysis_order.user_org_id = ? AND xt_dialysis_order.status = 1 AND xt_dialysis_order.start_nurse = ? AND xt_dialysis_order.created_time >= ? AND xt_dialysis_order.created_time <= ? ", user_org_id, tempConfig.ID, user_org_id, item.AdminUserId, start_time, end_time).Count(&TotalOne) db.Table("xt_monitoring_record ").Where("user_org_id = ? AND status = 1 AND monitoring_nurse = ? AND created_time >= ? AND created_time <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&TotalTwo) db.Table("xt_treatment_summary").Where("user_org_id = ? AND status = 1 AND creater = ? AND created_time >= ? AND created_time <= ?", user_org_id, item.AdminUserId, start_time, end_time).Count(&TotalThree) item.PunctureCount = Total item.ChangemedicineCount = TotalOne item.PCount = Total item.CureCount = TotalTwo item.MissionCount = TotalThree } if err != nil { return nil, err } return datas, nil } //工作量统计 type AdminUser struct { ID int64 `gorm:"column:id" json:"id" form:"id"` AdminUserId int64 `gorm:"column:admin_user_id" json:"admin_user_id" form:"admin_user_id"` OrgId int64 `gorm:"column:org_id" json:"org_id" form:"org_id"` UserName string `gorm:"column:user_name" json:"user_name" form:"user_name"` UserType int64 `gorm:"column:user_type" json:"user_type" form:"user_type"` } func GetAllAdminUser(user_org_id int64) (datas []*AdminUser, err error) { userDb := service.UserReadDB() userDb.Raw("select id, admin_user_id, user_name,org_id, user_type from sgj_user_admin_role Where status = 1 AND org_id = ?", user_org_id).Scan(&datas) return datas, nil } func FindOrgInspectionCount(user_org_id int64) (count int64, err error) { db := service.XTReadDB() err = db.Model(&models.InspectionReference{}).Where("status = 1 AND org_id = ?", user_org_id).Count(&count).Error return } func FindOrgInspectionReference(user_org_id int64) (references []*models.InspectionReference, err error) { db := service.XTReadDB() err = db.Model(&models.InspectionReference{}).Where("status = 1 AND org_id = ? AND range_max REGEXP '(^[0-9]+.[0-9]+$)|(^[0-9]$)' AND range_min REGEXP '(^[0-9]+.[0-9]+$)|(^[0-9]$)' ", user_org_id).Find(&references).Error return } func FindProcjectInspectionReference(user_org_id int64, project_id int64, item_id int64) (references models.InspectionReference, err error) { db := service.XTReadDB() err = db.Model(&models.InspectionReference{}).Where("status = 1 AND org_id = ? AND project_id = ? AND id = ?", user_org_id, project_id, item_id).First(&references).Error return } func FindOrgInspectionReferenceRangeTypeValue(user_org_id int64, project_id int64, item_id int64) (inspection []*models.Inspection, err error) { db := service.XTReadDB() err = db.Model(&models.Inspection{}).Where("status = 1 AND org_id = ? AND project_id = ? AND item_id = ? AND inspect_type = 2 AND inspect_value <> ''", user_org_id, project_id, item_id).Group("inspect_value").Find(&inspection).Error return } func FindOrgConfigRangeTypeValue(user_org_id int64, project_id int64, item_id int64) (qcs QualityControlStandard, err error) { db := service.XTReadDB() err = db.Model(&QualityControlStandard{}).Where("status = 1 AND user_org_id = ? AND inspection_major = ? AND inspection_minor = ?", user_org_id, project_id, item_id).First(&qcs).Error return } func GetInspectionChartData(user_org_id int64, start_time int64, end_time int64, project_id int64, item_id int64, range_type int, range_value string) (item []*otherItemAmount, err error) { db := service.XTReadDB() var items []*otherItemAmount var tempErr error selectContent := "CASE" range_value_arr := strings.Split(range_value, ",") fmt.Println(range_value_arr) if range_type == 1 { tempErr = db.Table("xt_inspection").Where("org_id=? and status=1 and created_time >= ? and created_time <= ? AND project_id = ? AND item_id = ?", user_org_id, start_time, end_time, project_id, item_id). Select("CASE WHEN inspect_value < " + range_value_arr[0] + "THEN" + "'" + "小于" + range_value_arr[0] + "'" + " WHEN inspect_value >= " + range_value_arr[0] + "AND inspect_value <= " + range_value_arr[1] + " THEN " + "'" + range_value_arr[0] + "~" + range_value_arr[1] + "'" + " WHEN inspect_value > " + range_value_arr[1] + "THEN " + "'" + "大于" + range_value_arr[1] + "'" + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("name").Scan(&items).Error var isHasConditionOne bool = false var isHasConditionTwo bool = false var isHasConditionThree bool = false for _, item := range items { if item.Name == "大于"+range_value_arr[1] { isHasConditionOne = true } if item.Name == "小于"+range_value_arr[0] { isHasConditionTwo = true } if item.Name == range_value_arr[0]+"~"+range_value_arr[1] { isHasConditionThree = true } } if !isHasConditionOne { newItem := &otherItemAmount{ Total: 0, Name: "大于" + range_value_arr[1], Ratio: "0", } items = append(items, newItem) } if !isHasConditionTwo { newItem := &otherItemAmount{ Total: 0, Name: "小于" + range_value_arr[0], Ratio: "0", } items = append(items, newItem) } if !isHasConditionThree { newItem := &otherItemAmount{ Total: 0, Name: range_value_arr[0] + "~" + range_value_arr[1], Ratio: "0", } items = append(items, newItem) } return items, tempErr } else { for _, item := range range_value_arr { //selectContent = selectContent + " WHEN inspect_value =" + item + " THEN " + "'" + item + "'" selectContent = selectContent + " WHEN inspect_value =" + "'" + item + "'" + " THEN " + "'" + item + "'" } tempErr = db.Table("xt_inspection").Where("org_id=? and status=1 and created_time >= ? and created_time <= ? AND project_id = ? AND item_id = ?", user_org_id, start_time, end_time, project_id, item_id). Select(selectContent + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("name").Scan(&items).Error return items, tempErr } } type Inspection struct { ID int64 `gorm:"column:id" json:"id" form:"id"` PatientId int64 `gorm:"column:patient_id" json:"patient_id" form:"patient_id"` OrgId int64 `gorm:"column:org_id" json:"org_id" form:"org_id"` ProjectId int64 `gorm:"column:project_id" json:"project_id" form:"project_id"` ItemId int64 `gorm:"column:item_id" json:"item_id" form:"item_id"` ItemName string `gorm:"column:item_name" json:"item_name" form:"item_name"` ProjectName string `gorm:"column:project_name" json:"project_name" form:"project_name"` InspectType int64 `gorm:"column:inspect_type" json:"inspect_type" form:"inspect_type"` InspectValue string `gorm:"column:inspect_value" json:"inspect_value" form:"inspect_value"` InspectDate int64 `gorm:"column:inspect_date" json:"inspect_date" form:"inspect_date"` Status int64 `gorm:"column:status" json:"status" form:"status"` CreatedTime int64 `gorm:"column:created_time" json:"created_time" form:"created_time"` UpdatedTime int64 `gorm:"column:updated_time" json:"updated_time" form:"updated_time"` Patient models.Patients `gorm:"ForeignKey:ID;AssociationForeignKey:PatientId" json:"patient"` } func (Inspection) TableName() string { return "xt_inspection" } func GetInspectionChartTableData(user_org_id int64, start_time int64, end_time int64, project_id int64, item_id int64, patient_id int64, page, limit int64, range_type int, range_value string) (datas []*Inspection, total int64, err error) { if range_type == 1 { index := strings.Index(range_value, "小于") indexTwo := strings.Index(range_value, "大于") indexThree := strings.Index(range_value, "~") if index != -1 { value, _ := strconv.ParseFloat(strings.Replace(range_value, "小于", "", 1), 64) db := service.XTReadDB() offset := (page - 1) * limit err = db.Model(&Inspection{}).Where("org_id = ? AND status = 1 AND created_time >= ? AND created_time <= ? AND project_id = ? AND item_id = ? AND status = 1 AND inspect_value < ?", user_org_id, start_time, end_time, project_id, item_id, value).Preload("Patient", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1 AND user_org_id = ?", user_org_id) }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error return datas, total, err } else if indexTwo != -1 { value, _ := strconv.ParseFloat(strings.Replace(range_value, "大于", "", 1), 64) db := service.XTReadDB() offset := (page - 1) * limit err = db.Model(&Inspection{}).Where("org_id = ? AND status = 1 AND created_time >= ? AND created_time <= ? AND project_id = ? AND item_id = ? AND status = 1 AND inspect_value > ?", user_org_id, start_time, end_time, project_id, item_id, value).Preload("Patient", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1 AND user_org_id = ?", user_org_id) }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error return datas, total, err } else if indexThree != -1 { range_value_arr := strings.Split(range_value, "~") fmt.Println(range_value_arr) float1, err := strconv.ParseFloat(range_value_arr[0], 64) float2, err := strconv.ParseFloat(range_value_arr[1], 64) fmt.Println(err) fmt.Println(float1) fmt.Println(float2) db := service.XTReadDB() offset := (page - 1) * limit err = db.Model(&Inspection{}).Where("org_id = ? AND status = 1 AND created_time >= ? AND created_time <= ? AND project_id = ? AND item_id = ? AND status = 1 AND inspect_value >= ? AND inspect_value <= ?", user_org_id, start_time, end_time, project_id, item_id, float1, float2).Preload("Patient", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1 AND user_org_id = ?", user_org_id) }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error return datas, total, err } else { db := service.XTReadDB() offset := (page - 1) * limit err = db.Model(&Inspection{}).Where("org_id = ? AND status = 1 AND created_time >= ? AND created_time <= ? AND project_id = ? AND item_id = ? AND status = 1 ", user_org_id, start_time, end_time, project_id, item_id).Preload("Patient", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1 AND user_org_id = ?", user_org_id) }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error return datas, total, err } } else { if range_value == "全部" { db := service.XTReadDB() offset := (page - 1) * limit err = db.Model(&Inspection{}).Where("org_id = ? AND status = 1 AND created_time >= ? AND created_time <= ? AND project_id = ? AND item_id = ? AND status = 1 ", user_org_id, start_time, end_time, project_id, item_id).Preload("Patient", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1 AND user_org_id = ?", user_org_id) }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error return datas, total, err } else { db := service.XTReadDB() offset := (page - 1) * limit err = db.Model(&Inspection{}).Where("org_id = ? AND status = 1 AND created_time >= ? AND created_time <= ? AND project_id = ? AND item_id = ? AND status = 1 AND inspect_value = ?", user_org_id, start_time, end_time, project_id, item_id, range_value).Preload("Patient", func(db *gorm.DB) *gorm.DB { return db.Where("status = 1 AND user_org_id = ?", user_org_id) }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error return datas, total, err } } } type NewIndexDataStruct struct { Date string `json:"date"` Value string `json:"value"` } func GetPatientInspectionChartData(user_org_id int64, start_time int64, end_time int64, project_id int64, item_id int64, patient_id int64) (datas []*NewIndexDataStruct, err error) { db := service.XTReadDB() err = db.Raw("select from_unixtime(inspect_date, '%Y-%m-%d') as date, inspect_value as value from xt_inspection Where status = 1 AND org_id = ? AND patient_id = ? AND project_id = ? AND item_id = ? AND created_time <= ? AND created_time >= ? ", user_org_id, patient_id, project_id, item_id, end_time, start_time).Scan(&datas).Error if err != nil { return nil, err } return datas, nil } func GetPatientInspectionBarChartData(user_org_id int64, start_time int64, end_time int64, project_id int64, item_id int64, range_type int, range_value string, patient_id int64) (item []*otherItemAmount, err error) { db := service.XTReadDB() var items []*otherItemAmount var tempErr error selectContent := "CASE" range_value_arr := strings.Split(range_value, ",") if range_type == 1 { tempErr = db.Table("xt_inspection").Where("org_id=? and status=1 and created_time >= ? and created_time <= ? AND project_id = ? AND item_id = ? AND patient_id = ?", user_org_id, start_time, end_time, project_id, item_id, patient_id). Select("CASE WHEN inspect_value < " + range_value_arr[0] + "THEN" + "'" + "小于" + range_value_arr[0] + "'" + " WHEN inspect_value >= " + range_value_arr[0] + "AND inspect_value <= " + range_value_arr[1] + " THEN " + "'" + range_value_arr[0] + "~" + range_value_arr[1] + "'" + " WHEN inspect_value > " + range_value_arr[1] + "THEN " + "'" + "大于" + range_value_arr[1] + "'" + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("name").Scan(&items).Error var isHasConditionOne bool = false var isHasConditionTwo bool = false var isHasConditionThree bool = false for _, item := range items { if item.Name == "大于"+range_value_arr[1] { isHasConditionOne = true } if item.Name == "小于"+range_value_arr[0] { isHasConditionTwo = true } if item.Name == range_value_arr[0]+"~"+range_value_arr[1] { isHasConditionThree = true } } if !isHasConditionOne { newItem := &otherItemAmount{ Total: 0, Name: "大于" + range_value_arr[1], Ratio: "0", } items = append(items, newItem) } if !isHasConditionTwo { newItem := &otherItemAmount{ Total: 0, Name: "小于" + range_value_arr[0], Ratio: "0", } items = append(items, newItem) } if !isHasConditionThree { newItem := &otherItemAmount{ Total: 0, Name: range_value_arr[0] + "~" + range_value_arr[1], Ratio: "0", } items = append(items, newItem) } return items, tempErr } else { for _, item := range range_value_arr { selectContent = selectContent + " WHEN inspect_value =" + "'" + item + "'" + " THEN " + "'" + item + "'" } tempErr = db.Table("xt_inspection").Where("org_id=? and status=1 and created_time >= ? and created_time <= ? AND patient_id = ?", user_org_id, start_time, end_time, patient_id). Select(selectContent + " ELSE '未知' END AS name, COUNT(*) AS total", ).Group("name").Scan(&items).Error return items, tempErr } }