index_evaluation_service.go 67KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595
  1. package statistics_service
  2. import (
  3. "XT_New/models"
  4. "XT_New/service"
  5. "fmt"
  6. "github.com/jinzhu/gorm"
  7. "math"
  8. "strconv"
  9. "strings"
  10. )
  11. func GetOrgFirstPatientInfo(user_org_id int64) (patient *models.Patients, err error) {
  12. db := service.XTReadDB()
  13. var tempPatient models.Patients
  14. findErr := db.Model(&models.Patients{}).Where("user_org_id = ? AND status = 1 AND lapseto = 1", user_org_id).Last(&tempPatient).Error
  15. if findErr == gorm.ErrRecordNotFound {
  16. return nil, nil
  17. }
  18. if findErr != nil {
  19. return nil, findErr
  20. }
  21. return &tempPatient, nil
  22. }
  23. type ProcessIndexDataStruct struct {
  24. Date string `json:"date"`
  25. Value float64 `json:"value"`
  26. }
  27. //透析过程统计
  28. func GetDialysisProcessIndexChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (datas []*ProcessIndexDataStruct, err error) {
  29. db := service.XTReadDB()
  30. switch statistics_type {
  31. case 1:
  32. 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
  33. break
  34. case 2:
  35. 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
  36. break
  37. case 3:
  38. 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
  39. break
  40. case 4:
  41. 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
  42. break
  43. case 5:
  44. 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
  45. break
  46. case 6:
  47. 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
  48. break
  49. case 7:
  50. 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
  51. break
  52. case 8:
  53. 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
  54. break
  55. }
  56. if err != nil {
  57. return nil, err
  58. }
  59. return datas, nil
  60. }
  61. type otherItemAmount struct {
  62. Total int64 `json:"total"`
  63. Name string `json:"name"`
  64. Ratio string `json:"ratio"`
  65. }
  66. func GetDialysisProcessIndexOtherChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (item []*otherItemAmount, err error) {
  67. db := service.XTReadDB()
  68. var items []*otherItemAmount
  69. var tempErr error
  70. var total int64
  71. switch statistics_type {
  72. case 9:
  73. 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).
  74. Select("CASE WHEN p.mode_id = 1 THEN 'HD'" +
  75. " WHEN p.mode_id = 2 THEN 'HDF'" +
  76. " WHEN p.mode_id = 3 THEN 'HD+HP'" +
  77. " WHEN p.mode_id = 4 THEN 'HP'" +
  78. " WHEN p.mode_id = 5 THEN 'HF'" +
  79. " WHEN p.mode_id = 6 THEN 'SCUF'" +
  80. " WHEN p.mode_id = 7 THEN 'IUF'" +
  81. " WHEN p.mode_id = 8 THEN 'HFHD'" +
  82. " WHEN p.mode_id = 9 THEN 'HFHD+HP'" +
  83. " WHEN p.mode_id = 10 THEN 'PHF'" +
  84. " WHEN p.mode_id = 11 THEN 'HFR'" +
  85. " WHEN p.mode_id = 12 THEN 'HDF+HP'" +
  86. " WHEN p.mode_id = 13 THEN 'CRRT'" +
  87. " WHEN p.mode_id = 14 THEN '腹水回输'" +
  88. " WHEN p.mode_id = 19 THEN 'IUF+HD'" +
  89. " ELSE '未知' END AS name, COUNT(*) AS total",
  90. ).Group("p.mode_id").Scan(&items).Error
  91. break
  92. case 10:
  93. config, _ := GetAnticoagulantData(user_org_id)
  94. selectContent := "CASE"
  95. for _, item := range config {
  96. fmt.Println(selectContent)
  97. selectContent = selectContent + " WHEN p.anticoagulant =" + strconv.Itoa(item.Value) + " THEN " + "'" + item.Name + "'"
  98. }
  99. fmt.Println(selectContent)
  100. 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).
  101. Select(selectContent +
  102. " ELSE '未知' END AS name, COUNT(*) AS total",
  103. ).Group("p.anticoagulant").Scan(&items).Error
  104. break
  105. }
  106. 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)
  107. for _, item := range items {
  108. if math.IsNaN(float64(item.Total) / float64(total)) {
  109. item.Ratio = "0"
  110. } else {
  111. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(total))*100), 64)
  112. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  113. }
  114. }
  115. if tempErr != nil {
  116. return nil, err
  117. }
  118. return items, nil
  119. }
  120. type PatientDialysisRecord struct {
  121. models.VMSchedule
  122. DeviceNumber VMDeviceNumber `gorm:"foreignkey:ID;AssociationForeignKey:BedId;" json:"device_number"`
  123. DialysisPrescription VMDialysisPrescription `json:"prescription" gorm:"foreignkey:RecordDate;AssociationForeignKey:ScheduleDate;"`
  124. PredialysisEvaluation VMPredialysisEvaluation `json:"predialysis_evaluation" gorm:"foreignkey:AssessmentDate;AssociationForeignKey:ScheduleDate;"`
  125. AssessmentAfterDislysis models.AssessmentAfterDislysis `json:"assessment_after_dislysis" gorm:"foreignkey:AssessmentDate;AssociationForeignKey:ScheduleDate;"`
  126. Patient VMPatients `json:"patient" gorm:"foreignkey:ID;AssociationForeignKey:PatientID;"`
  127. }
  128. func GetDialysisProcessIndexTableData(orgID, patientID int64, page, limit, start, end int64) ([]*PatientDialysisRecord, int64, error) {
  129. offset := (page - 1) * limit
  130. var total int64
  131. var err error
  132. var orders []*PatientDialysisRecord
  133. readDb := service.XTReadDB()
  134. db := readDb.Table("xt_schedule as sch").
  135. Preload("DeviceNumber", "org_id=? and status=1", orgID).
  136. Preload("DialysisPrescription", "patient_id=? and user_org_id=? and status=1", patientID, orgID).
  137. Preload("PredialysisEvaluation", "patient_id=? and user_org_id=? and status=1", patientID, orgID).
  138. Preload("AssessmentAfterDislysis", "patient_id=? and user_org_id=? and status=1", patientID, orgID).
  139. Preload("Patient", "user_org_id=? and status=1", orgID).
  140. Where("sch.patient_id=? and sch.user_org_id=? and sch.status=1", patientID, orgID).Group("sch.schedule_date")
  141. if start != 0 {
  142. db = db.Where("sch.schedule_date>=?", start)
  143. }
  144. if end != 0 {
  145. db = db.Where("sch.schedule_date<=?", end)
  146. }
  147. 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
  148. return orders, total, err
  149. }
  150. func GetAnticoagulantData(user_org_id int64) (config []*models.Dataconfig, tempErr error) {
  151. var tempDataConfig []*models.Dataconfig
  152. var tempConfig models.Dataconfig
  153. db := service.XTReadDB()
  154. db.Model(&models.Dataconfig{}).Where("name = '抗凝剂' AND field_name = 'anticoagulant' AND parent_id = 0").First(&tempConfig)
  155. err := db.Model(&models.Dataconfig{}).Where("(org_id = 0 OR org_id = ?) AND parent_id = ?", user_org_id, tempConfig.ID).Find(&tempDataConfig).Error
  156. return tempDataConfig, err
  157. }
  158. //透析过程统计
  159. //透析监测统计
  160. func GetDialysisWatchChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (datas []*ProcessIndexDataStruct, err error) {
  161. db := service.XTReadDB()
  162. switch statistics_type {
  163. case 1:
  164. if patient_id == 0 {
  165. 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
  166. } else {
  167. 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
  168. }
  169. break
  170. case 2:
  171. if patient_id == 0 {
  172. //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
  173. 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
  174. } else {
  175. //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
  176. 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
  177. }
  178. break
  179. case 3:
  180. if patient_id == 0 {
  181. 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
  182. } else {
  183. 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
  184. }
  185. break
  186. case 4:
  187. if patient_id == 0 {
  188. 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
  189. } else {
  190. 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
  191. }
  192. break
  193. case 5:
  194. if patient_id == 0 {
  195. 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
  196. } else {
  197. 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
  198. }
  199. break
  200. case 6:
  201. if patient_id == 0 {
  202. 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
  203. } else {
  204. 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
  205. }
  206. break
  207. case 7:
  208. if patient_id == 0 {
  209. 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
  210. } else {
  211. 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
  212. }
  213. break
  214. case 8:
  215. if patient_id == 0 {
  216. 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
  217. } else {
  218. 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
  219. }
  220. break
  221. case 9:
  222. if patient_id == 0 {
  223. 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
  224. } else {
  225. 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
  226. }
  227. break
  228. }
  229. if err != nil {
  230. return nil, err
  231. }
  232. return datas, nil
  233. }
  234. func GetDialysisWatchTableData(orgID, patientID int64, page, limit, start, end int64) ([]*VMMonitoringRecord, int64, error) {
  235. offset := (page - 1) * limit
  236. var total int64
  237. var err error
  238. var orders []*VMMonitoringRecord
  239. readDb := service.XTReadDB()
  240. db := readDb.Table("xt_monitoring_record as mo").
  241. Where(" mo.user_org_id=? and mo.status=1", orgID)
  242. if patientID != 0 {
  243. db = db.Where("mo.patient_id =?", patientID)
  244. }
  245. if start != 0 {
  246. db = db.Where("mo.operate_time>=?", start)
  247. }
  248. if end != 0 {
  249. db = db.Where("mo.operate_time<=?", end)
  250. }
  251. 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
  252. return orders, total, err
  253. }
  254. //透析监测统计
  255. //透析体重统计
  256. func GetDialysisWeightChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int) (item []*otherItemAmount, err error) {
  257. db := service.XTReadDB()
  258. var items []*otherItemAmount
  259. var tempErr error
  260. var Total int64
  261. switch statistics_type {
  262. case 1:
  263. 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).Count(&Total)
  264. 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).
  265. Select("CASE WHEN dry_weight < 40 THEN '小于40kg'" +
  266. " WHEN dry_weight >= 40 AND dry_weight < 50 THEN '40~50kg'" +
  267. " WHEN dry_weight >= 50 AND dry_weight < 60 THEN '50~60kg'" +
  268. " WHEN dry_weight >= 60 AND dry_weight < 70 THEN '60~70kg'" +
  269. " WHEN dry_weight >= 70 THEN '大于70kg'" +
  270. " ELSE '未知' END AS name, COUNT(*) AS total",
  271. ).Group("name").Scan(&items).Error
  272. var isHasConditionOne bool = false
  273. var isHasConditionTwo bool = false
  274. var isHasConditionThree bool = false
  275. var isHasConditionFour bool = false
  276. var isHasConditionFive bool = false
  277. for _, item := range items {
  278. if item.Name == "小于40kg" {
  279. isHasConditionOne = true
  280. }
  281. if item.Name == "40~50kg" {
  282. isHasConditionTwo = true
  283. }
  284. if item.Name == "60~70kg" {
  285. isHasConditionThree = true
  286. }
  287. if item.Name == "大于70kg" {
  288. isHasConditionFour = true
  289. }
  290. if item.Name == "未知" {
  291. isHasConditionFive = true
  292. }
  293. }
  294. if !isHasConditionOne {
  295. newItem := &otherItemAmount{
  296. Total: 0,
  297. Name: "小于40kg",
  298. Ratio: "0",
  299. }
  300. items = append(items, newItem)
  301. }
  302. if !isHasConditionTwo {
  303. newItem := &otherItemAmount{
  304. Total: 0,
  305. Name: "40~50kg",
  306. Ratio: "0",
  307. }
  308. items = append(items, newItem)
  309. }
  310. if !isHasConditionThree {
  311. newItem := &otherItemAmount{
  312. Total: 0,
  313. Name: "60~70kg",
  314. Ratio: "0",
  315. }
  316. items = append(items, newItem)
  317. }
  318. if !isHasConditionFour {
  319. newItem := &otherItemAmount{
  320. Total: 0,
  321. Name: "大于70kg",
  322. Ratio: "0",
  323. }
  324. items = append(items, newItem)
  325. }
  326. if !isHasConditionFive {
  327. newItem := &otherItemAmount{
  328. Total: 0,
  329. Name: "未知",
  330. Ratio: "0",
  331. }
  332. items = append(items, newItem)
  333. }
  334. for _, item := range items {
  335. if math.IsNaN(float64(item.Total) / float64(Total)) {
  336. item.Ratio = "0"
  337. } else {
  338. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  339. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  340. }
  341. }
  342. break
  343. case 2:
  344. 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).Count(&Total)
  345. 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).
  346. Select("CASE WHEN weight_before < 40 THEN '小于40kg'" +
  347. " WHEN weight_before >= 40 AND weight_before < 50 THEN '40~50kg'" +
  348. " WHEN weight_before >= 50 AND weight_before < 60 THEN '50~60kg'" +
  349. " WHEN weight_before >= 60 AND weight_before < 70 THEN '60~70kg'" +
  350. " WHEN weight_before >= 70 THEN '大于70kg'" +
  351. " ELSE '未知' END AS name, COUNT(*) AS total",
  352. ).Group("name").Scan(&items).Error
  353. var isHasConditionOne bool = false
  354. var isHasConditionTwo bool = false
  355. var isHasConditionThree bool = false
  356. var isHasConditionFour bool = false
  357. var isHasConditionFive bool = false
  358. for _, item := range items {
  359. if item.Name == "小于40kg" {
  360. isHasConditionOne = true
  361. }
  362. if item.Name == "40~50kg" {
  363. isHasConditionTwo = true
  364. }
  365. if item.Name == "60~70kg" {
  366. isHasConditionThree = true
  367. }
  368. if item.Name == "大于70kg" {
  369. isHasConditionFour = true
  370. }
  371. if item.Name == "未知" {
  372. isHasConditionFive = true
  373. }
  374. }
  375. if !isHasConditionOne {
  376. newItem := &otherItemAmount{
  377. Total: 0,
  378. Name: "小于40kg",
  379. Ratio: "0",
  380. }
  381. items = append(items, newItem)
  382. }
  383. if !isHasConditionTwo {
  384. newItem := &otherItemAmount{
  385. Total: 0,
  386. Name: "40~50kg",
  387. Ratio: "0",
  388. }
  389. items = append(items, newItem)
  390. }
  391. if !isHasConditionThree {
  392. newItem := &otherItemAmount{
  393. Total: 0,
  394. Name: "60~70kg",
  395. Ratio: "0",
  396. }
  397. items = append(items, newItem)
  398. }
  399. if !isHasConditionFour {
  400. newItem := &otherItemAmount{
  401. Total: 0,
  402. Name: "大于70kg",
  403. Ratio: "0",
  404. }
  405. items = append(items, newItem)
  406. }
  407. if !isHasConditionFive {
  408. newItem := &otherItemAmount{
  409. Total: 0,
  410. Name: "未知",
  411. Ratio: "0",
  412. }
  413. items = append(items, newItem)
  414. }
  415. for _, item := range items {
  416. if math.IsNaN(float64(item.Total) / float64(Total)) {
  417. item.Ratio = "0"
  418. } else {
  419. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  420. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  421. }
  422. }
  423. break
  424. case 3:
  425. //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).Count(&Total)
  426. //db.Raw("Select count(*) 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).Count(&Total)
  427. var newTotal int64
  428. type weight struct {
  429. WeightAfter float64 `json:"weight_after"`
  430. WeightBefore float64 `json:"weight_before"`
  431. }
  432. var weights []*weight
  433. var weightAdd []float64
  434. 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)
  435. for index, _ := range weights {
  436. if index+1 < len(weights) {
  437. if weights[index+1].WeightAfter == 0 || weights[index].WeightBefore == 0 {
  438. continue
  439. }
  440. weightAdd = append(weightAdd, weights[index].WeightBefore-weights[index+1].WeightAfter)
  441. }
  442. }
  443. var total_one int64
  444. var total_two int64
  445. var total_three int64
  446. var total_four int64
  447. var total_five int64
  448. for _, item := range weightAdd {
  449. if item < 1 {
  450. total_one++
  451. }
  452. if item >= 1 && item < 2 {
  453. total_two++
  454. }
  455. if item >= 2 && item < 3 {
  456. total_three++
  457. }
  458. if item >= 3 && item <= 4 {
  459. total_four++
  460. }
  461. if item > 4 {
  462. total_five++
  463. }
  464. }
  465. newTotal = total_one + total_two + total_three + total_four + total_five
  466. newItem := &otherItemAmount{
  467. Total: total_one,
  468. Name: "小于1kg",
  469. Ratio: "0",
  470. }
  471. newItem1 := &otherItemAmount{
  472. Total: total_two,
  473. Name: "1-2kg",
  474. Ratio: "0",
  475. }
  476. newItem2 := &otherItemAmount{
  477. Total: total_three,
  478. Name: "2-3kg",
  479. Ratio: "0",
  480. }
  481. newItem3 := &otherItemAmount{
  482. Total: total_four,
  483. Name: "3-4kg",
  484. Ratio: "0",
  485. }
  486. newItem4 := &otherItemAmount{
  487. Total: total_five,
  488. Name: "大于4kg",
  489. Ratio: "0",
  490. }
  491. items = append(items, newItem)
  492. items = append(items, newItem1)
  493. items = append(items, newItem2)
  494. items = append(items, newItem3)
  495. items = append(items, newItem4)
  496. for _, item := range items {
  497. if math.IsNaN(float64(item.Total) / float64(newTotal)) {
  498. item.Ratio = "0"
  499. } else {
  500. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(newTotal))*100), 64)
  501. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  502. }
  503. }
  504. break
  505. case 4:
  506. 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).Count(&Total)
  507. 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).
  508. Select("CASE WHEN weight_after < 40 THEN '小于40kg'" +
  509. " WHEN weight_after >= 40 AND weight_after < 50 THEN '40~50kg'" +
  510. " WHEN weight_after >= 50 AND weight_after < 60 THEN '50~60kg'" +
  511. " WHEN weight_after >= 60 AND weight_after < 70 THEN '60~70kg'" +
  512. " WHEN weight_after >= 70 THEN '大于70kg'" +
  513. " ELSE '未知' END AS name, COUNT(*) AS total",
  514. ).Group("name").Scan(&items).Error
  515. var isHasConditionOne bool = false
  516. var isHasConditionTwo bool = false
  517. var isHasConditionThree bool = false
  518. var isHasConditionFour bool = false
  519. var isHasConditionFive bool = false
  520. for _, item := range items {
  521. if item.Name == "小于40kg" {
  522. isHasConditionOne = true
  523. }
  524. if item.Name == "40~50kg" {
  525. isHasConditionTwo = true
  526. }
  527. if item.Name == "60~70kg" {
  528. isHasConditionThree = true
  529. }
  530. if item.Name == "大于70kg" {
  531. isHasConditionFour = true
  532. }
  533. if item.Name == "未知" {
  534. isHasConditionFive = true
  535. }
  536. }
  537. if !isHasConditionOne {
  538. newItem := &otherItemAmount{
  539. Total: 0,
  540. Name: "小于40kg",
  541. Ratio: "0",
  542. }
  543. items = append(items, newItem)
  544. }
  545. if !isHasConditionTwo {
  546. newItem := &otherItemAmount{
  547. Total: 0,
  548. Name: "40~50kg",
  549. Ratio: "0",
  550. }
  551. items = append(items, newItem)
  552. }
  553. if !isHasConditionThree {
  554. newItem := &otherItemAmount{
  555. Total: 0,
  556. Name: "60~70kg",
  557. Ratio: "0",
  558. }
  559. items = append(items, newItem)
  560. }
  561. if !isHasConditionFour {
  562. newItem := &otherItemAmount{
  563. Total: 0,
  564. Name: "大于70kg",
  565. Ratio: "0",
  566. }
  567. items = append(items, newItem)
  568. }
  569. if !isHasConditionFive {
  570. newItem := &otherItemAmount{
  571. Total: 0,
  572. Name: "未知",
  573. Ratio: "0",
  574. }
  575. items = append(items, newItem)
  576. }
  577. for _, item := range items {
  578. if math.IsNaN(float64(item.Total) / float64(Total)) {
  579. item.Ratio = "0"
  580. } else {
  581. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  582. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  583. }
  584. }
  585. break
  586. }
  587. if tempErr != nil {
  588. return nil, err
  589. }
  590. fmt.Println(items)
  591. return items, nil
  592. }
  593. func GetDialysisWeightTableData(orgID, patientID int64, page, limit, start, end int64) ([]*VMPredialysisEvaluation, int64, error) {
  594. offset := (page - 1) * limit
  595. var total int64
  596. var err error
  597. var orders []*VMPredialysisEvaluation
  598. readDb := service.XTReadDB()
  599. db := readDb.Table("xt_assessment_before_dislysis")
  600. db = db.Where(" user_org_id=? and status=1", orgID)
  601. if patientID > 0 {
  602. db = db.Where("patient_id=?", patientID)
  603. }
  604. if start != 0 {
  605. db = db.Where("assessment_date>=?", start)
  606. }
  607. if end != 0 {
  608. db = db.Where("assessment_date<=?", end)
  609. }
  610. db = db.Preload("VMAssessmentAfterDislysis", "status = 1 AND user_org_id = ?", orgID).Preload("VMPatients", "status = 1 AND user_org_id = ?", orgID)
  611. err = db.Count(&total).Offset(offset).Limit(limit).Order("assessment_date desc").Select("dry_weight, weight_before, patient_id, assessment_date").Find(&orders).Error
  612. for _, item := range orders {
  613. after, _ := GetLastAfterWeight(orgID, item.AssessmentDate, item.PatientId)
  614. if after.ID > 0 {
  615. fmt.Println(after.WeightAfter)
  616. item.LastAfterWeight = after.WeightAfter
  617. }
  618. }
  619. return orders, total, err
  620. }
  621. type LastAfter struct {
  622. ID int64 `json:"id"`
  623. WeightAfter float64 `json:"weight_after"`
  624. }
  625. func GetLastAfterWeight(user_org_id int64, before_assessment_date int64, patient_id int64) (after LastAfter, err error) {
  626. readDb := service.XTReadDB()
  627. 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
  628. return
  629. }
  630. func GetPatientDialysisWeightChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (datas []*ProcessIndexDataStruct, err error) {
  631. db := service.XTReadDB()
  632. switch statistics_type {
  633. case 1:
  634. 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
  635. break
  636. case 2:
  637. 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
  638. break
  639. case 3:
  640. type weight struct {
  641. WeightAfter float64 `json:"weight_after"`
  642. WeightBefore float64 `json:"weight_before"`
  643. Date string `json:"date"`
  644. }
  645. var weights []*weight
  646. 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)
  647. fmt.Println(len(weights))
  648. for index, _ := range weights {
  649. if index+1 < len(weights) {
  650. var weight_add ProcessIndexDataStruct
  651. fmt.Println(weights[index+1].WeightAfter)
  652. fmt.Println(weights[index].WeightBefore)
  653. if weights[index+1].WeightAfter == 0 || weights[index].WeightBefore == 0 {
  654. continue
  655. }
  656. add := weights[index].WeightBefore - weights[index+1].WeightAfter
  657. weight_add.Value = add
  658. weight_add.Date = weights[index].Date
  659. datas = append(datas, &weight_add)
  660. }
  661. }
  662. break
  663. case 4:
  664. 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
  665. break
  666. }
  667. if err != nil {
  668. return nil, err
  669. }
  670. return datas, nil
  671. }
  672. //透析体重统计
  673. //透析血压统计
  674. func GetBloodPressureChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int, patient_id int64) (item []*otherItemAmount, err error) {
  675. db := service.XTReadDB()
  676. var items []*otherItemAmount
  677. var tempErr error
  678. var TotalOne int64
  679. var TotalTwo int64
  680. var Total int64
  681. switch statistics_type {
  682. case 1:
  683. type bp struct {
  684. SystolicBloodPressure float64 `json:"systolic_blood_pressure"`
  685. DiastolicBloodPressure float64 `json:"diastolic_blood_pressure"`
  686. }
  687. var bps []*bp
  688. if patient_id == 0 {
  689. 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)
  690. db.Raw("SELECT count(id) FROM xt_assessment_before_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? ", user_org_id, start_time, end_time).Count(&TotalOne)
  691. db.Raw("SELECT count(id) FROM xt_assessment_after_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? ", user_org_id, start_time, end_time).Count(&TotalTwo)
  692. Total = TotalOne + TotalTwo
  693. fmt.Println("----Total-----")
  694. fmt.Println(TotalOne)
  695. fmt.Println(TotalTwo)
  696. fmt.Println(Total)
  697. } else {
  698. 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)
  699. db.Raw("SELECT count(id) FROM xt_assessment_before_dislysis Where user_org_id = ? AND created_time >= ? AND created_time <= ? AND patient_id = ?", user_org_id, start_time, end_time, patient_id).Count(&TotalOne)
  700. db.Raw("SELECT count(id) 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).Count(&TotalTwo)
  701. Total = TotalOne + TotalTwo
  702. fmt.Println(TotalOne)
  703. fmt.Println(TotalTwo)
  704. fmt.Println(Total)
  705. }
  706. var total_one int64
  707. var total_two int64
  708. var total_three int64
  709. var total_four int64
  710. for _, item := range bps {
  711. if item.SystolicBloodPressure > 160 && item.DiastolicBloodPressure > 100 {
  712. total_one++
  713. } else if item.SystolicBloodPressure < 140 && item.DiastolicBloodPressure < 99 {
  714. total_two++
  715. } else if item.SystolicBloodPressure >= 140 && item.SystolicBloodPressure <= 160 && item.DiastolicBloodPressure >= 99 && item.DiastolicBloodPressure <= 100 {
  716. total_three++
  717. } else {
  718. total_four++
  719. }
  720. }
  721. newItem := &otherItemAmount{
  722. Total: total_one,
  723. Name: "大于160/100mmHg",
  724. Ratio: "0",
  725. }
  726. newItem1 := &otherItemAmount{
  727. Total: total_two,
  728. Name: "小于140/99mmHg",
  729. Ratio: "0",
  730. }
  731. newItem2 := &otherItemAmount{
  732. Total: total_three,
  733. Name: "140-160mmHg/90-100mmHg",
  734. Ratio: "0",
  735. }
  736. newItem3 := &otherItemAmount{
  737. Total: total_four,
  738. Name: "其他",
  739. Ratio: "0",
  740. }
  741. items = append(items, newItem)
  742. items = append(items, newItem1)
  743. items = append(items, newItem2)
  744. items = append(items, newItem3)
  745. for _, item := range items {
  746. if math.IsNaN(float64(item.Total) / float64(Total)) {
  747. item.Ratio = "0"
  748. } else {
  749. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  750. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  751. }
  752. }
  753. break
  754. case 2:
  755. if patient_id == 0 {
  756. 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).
  757. Select("CASE WHEN systolic_blood_pressure > 160 AND diastolic_blood_pressure > 100 THEN '大于160/100mmHg'" +
  758. " WHEN systolic_blood_pressure < 140 AND diastolic_blood_pressure < 99 THEN '小于140/99mmHg'" +
  759. " WHEN systolic_blood_pressure >= 140 AND systolic_blood_pressure <= 160 AND diastolic_blood_pressure >= 99 AND diastolic_blood_pressure <= 100 THEN '140-160mmHg/90-100mmHg'" +
  760. " ELSE '其他' END AS name, COUNT(*) AS total",
  761. ).Group("name").Scan(&items).Error
  762. 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).Count(&Total)
  763. } else {
  764. 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).
  765. Select("CASE WHEN systolic_blood_pressure > 160 AND diastolic_blood_pressure > 100 THEN '大于160/100mmHg'" +
  766. " WHEN systolic_blood_pressure < 140 AND diastolic_blood_pressure < 99 THEN '小于140/99mmHg'" +
  767. " WHEN systolic_blood_pressure >= 140 AND systolic_blood_pressure <= 160 AND diastolic_blood_pressure >= 99 AND diastolic_blood_pressure <= 100 THEN '140-160mmHg/90-100mmHg'" +
  768. " ELSE '其他' END AS name, COUNT(*) AS total",
  769. ).Group("name").Scan(&items).Error
  770. 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).Count(&Total)
  771. }
  772. var isHasConditionOne bool = false
  773. var isHasConditionTwo bool = false
  774. var isHasConditionThree bool = false
  775. var isHasConditionFour bool = false
  776. for _, item := range items {
  777. if item.Name == "大于160/100mmHg" {
  778. isHasConditionOne = true
  779. }
  780. if item.Name == "小于140/99mmHg" {
  781. isHasConditionTwo = true
  782. }
  783. if item.Name == "140-160mmHg/90-100mmHg" {
  784. isHasConditionThree = true
  785. }
  786. if item.Name == "其他" {
  787. isHasConditionFour = true
  788. }
  789. }
  790. if !isHasConditionOne {
  791. newItem := &otherItemAmount{
  792. Total: 0,
  793. Name: "大于160/100mmHg",
  794. Ratio: "0",
  795. }
  796. items = append(items, newItem)
  797. }
  798. if !isHasConditionTwo {
  799. newItem := &otherItemAmount{
  800. Total: 0,
  801. Name: "小于140/99mmHg",
  802. Ratio: "0",
  803. }
  804. items = append(items, newItem)
  805. }
  806. if !isHasConditionThree {
  807. newItem := &otherItemAmount{
  808. Total: 0,
  809. Name: "140-160mmHg/90-100mmHg",
  810. Ratio: "0",
  811. }
  812. items = append(items, newItem)
  813. }
  814. if !isHasConditionFour {
  815. newItem := &otherItemAmount{
  816. Total: 0,
  817. Name: "其他",
  818. Ratio: "0",
  819. }
  820. items = append(items, newItem)
  821. }
  822. for _, item := range items {
  823. if math.IsNaN(float64(item.Total) / float64(Total)) {
  824. item.Ratio = "0"
  825. } else {
  826. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  827. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  828. }
  829. }
  830. break
  831. case 3:
  832. if patient_id == 0 {
  833. 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).
  834. Select("CASE WHEN systolic_blood_pressure > 160 AND diastolic_blood_pressure > 100 THEN '大于160/100mmHg'" +
  835. " WHEN systolic_blood_pressure < 140 AND diastolic_blood_pressure < 99 THEN '小于140/99mmHg'" +
  836. " WHEN systolic_blood_pressure >= 140 AND systolic_blood_pressure <= 160 AND diastolic_blood_pressure >= 99 AND diastolic_blood_pressure <= 100 THEN '140-160mmHg/90-100mmHg'" +
  837. " ELSE '其他' END AS name, COUNT(*) AS total",
  838. ).Group("name").Scan(&items).Error
  839. 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).Count(&Total)
  840. } else {
  841. 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).
  842. Select("CASE WHEN systolic_blood_pressure > 160 AND diastolic_blood_pressure > 100 THEN '大于160/100mmHg'" +
  843. " WHEN systolic_blood_pressure < 140 AND diastolic_blood_pressure < 99 THEN '小于140/99mmHg'" +
  844. " WHEN systolic_blood_pressure >= 140 AND systolic_blood_pressure <= 160 AND diastolic_blood_pressure >= 99 AND diastolic_blood_pressure <= 100 THEN '140-160mmHg/90-100mmHg'" +
  845. " ELSE '其他' END AS name, COUNT(*) AS total",
  846. ).Group("name").Scan(&items).Error
  847. 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).Count(&Total)
  848. }
  849. var isHasConditionOne bool = false
  850. var isHasConditionTwo bool = false
  851. var isHasConditionThree bool = false
  852. var isHasConditionFour bool = false
  853. for _, item := range items {
  854. if item.Name == "大于160/100mmHg" {
  855. isHasConditionOne = true
  856. }
  857. if item.Name == "小于140/99mmHg" {
  858. isHasConditionTwo = true
  859. }
  860. if item.Name == "140-160mmHg/90-100mmHg" {
  861. isHasConditionThree = true
  862. }
  863. if item.Name == "其他" {
  864. isHasConditionFour = true
  865. }
  866. }
  867. if !isHasConditionOne {
  868. newItem := &otherItemAmount{
  869. Total: 0,
  870. Name: "大于160/100mmHg",
  871. Ratio: "0",
  872. }
  873. items = append(items, newItem)
  874. }
  875. if !isHasConditionTwo {
  876. newItem := &otherItemAmount{
  877. Total: 0,
  878. Name: "小于140/99mmHg",
  879. Ratio: "0",
  880. }
  881. items = append(items, newItem)
  882. }
  883. if !isHasConditionThree {
  884. newItem := &otherItemAmount{
  885. Total: 0,
  886. Name: "140-160mmHg/90-100mmHg",
  887. Ratio: "0",
  888. }
  889. items = append(items, newItem)
  890. }
  891. if !isHasConditionFour {
  892. newItem := &otherItemAmount{
  893. Total: 0,
  894. Name: "其他",
  895. Ratio: "0",
  896. }
  897. items = append(items, newItem)
  898. }
  899. for _, item := range items {
  900. if math.IsNaN(float64(item.Total) / float64(Total)) {
  901. item.Ratio = "0"
  902. } else {
  903. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  904. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  905. }
  906. }
  907. break
  908. }
  909. if tempErr != nil {
  910. return nil, err
  911. }
  912. return items, nil
  913. }
  914. func GetBloodPressureTableData(orgID, patientID int64, page, limit, start, end int64) ([]*VMSchedule, int64, error) {
  915. offset := (page - 1) * limit
  916. var total int64
  917. var err error
  918. var orders []*VMSchedule
  919. readDb := service.XTReadDB()
  920. db := readDb.Table("xt_schedule as sch")
  921. db = db.Where(" sch.user_org_id=? and sch.status=1", orgID)
  922. if patientID > 0 {
  923. db = db.Where("sch.patient_id=?", patientID)
  924. }
  925. if start != 0 {
  926. db = db.Where("sch.created_time>=?", start)
  927. }
  928. if end != 0 {
  929. db = db.Where("sch.created_time<=?", end)
  930. }
  931. db = db.Preload("VMPredialysisEvaluation", "status = 1 AND user_org_id = ?", orgID).
  932. Preload("VMAssessmentAfterDislysis", "status = 1 AND user_org_id = ?", orgID).
  933. Preload("VMMinMonitoringRecord", func(db *gorm.DB) *gorm.DB {
  934. return db.Where("status = 1 AND user_org_id = ?", orgID).Order("systolic_blood_pressure DESC")
  935. }).
  936. Preload("VMMaxMonitoringRecord", func(db *gorm.DB) *gorm.DB {
  937. return db.Where("status = 1 AND user_org_id = ?", orgID).Order("systolic_blood_pressure ASC")
  938. }).
  939. Preload("VMPatients", "status = 1 AND user_org_id = ?", orgID)
  940. 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
  941. return orders, total, err
  942. }
  943. type BPDataStruct struct {
  944. Date string `json:"date"`
  945. SystolicBloodPressure float64 `json:"systolic_blood_pressure"`
  946. DiastolicBloodPressure float64 `json:"diastolic_blood_pressure"`
  947. }
  948. func GetPatientBloodPressureChartData(user_org_id int64, patient_id int64, start_time int64, end_time int64, statistics_type int) (datas []*BPDataStruct, err error) {
  949. db := service.XTReadDB()
  950. switch statistics_type {
  951. case 1:
  952. 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
  953. break
  954. case 2:
  955. 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
  956. break
  957. }
  958. if err != nil {
  959. return nil, err
  960. }
  961. return datas, nil
  962. }
  963. //透析血压统计
  964. //工作量统计
  965. func GetDoctorWorkloadChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int) (datas []*VMUserAdminRole, err error) {
  966. userDb := service.UserReadDB()
  967. db := service.XTReadDB()
  968. 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)
  969. switch statistics_type {
  970. case 1:
  971. for _, item := range datas {
  972. var total int64
  973. 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)
  974. item.PCount = total
  975. }
  976. break
  977. case 2:
  978. for _, item := range datas {
  979. var total int64
  980. 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)
  981. item.CourseCount = total
  982. }
  983. break
  984. case 3:
  985. for _, item := range datas {
  986. var total int64
  987. 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)
  988. item.RescueCount = total
  989. }
  990. break
  991. }
  992. if err != nil {
  993. return nil, err
  994. }
  995. fmt.Println(datas)
  996. return datas, nil
  997. }
  998. func GetDoctorWorkloadTableData(user_org_id int64, start_time int64, end_time int64, admin_user_id int64) (datas []*VMUserAdminRole, err error) {
  999. userDb := service.UserReadDB()
  1000. db := service.XTReadDB()
  1001. if admin_user_id == 0 {
  1002. 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)
  1003. } else {
  1004. 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)
  1005. }
  1006. for _, item := range datas {
  1007. var Total int64
  1008. var TotalOne int64
  1009. var TotalTwo int64
  1010. 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)
  1011. 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)
  1012. 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)
  1013. item.PCount = Total
  1014. item.CourseCount = TotalOne
  1015. item.RescueCount = TotalTwo
  1016. }
  1017. if err != nil {
  1018. return nil, err
  1019. }
  1020. return datas, nil
  1021. }
  1022. func GetNurseWorkloadChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int) (datas []*VMUserAdminRole, err error) {
  1023. userDb := service.UserReadDB()
  1024. db := service.XTReadDB()
  1025. 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)
  1026. var tempConfig models.Dataconfig
  1027. db.Model(&models.Dataconfig{}).Where("name = '血管通路' AND module = 'hemodialysis' AND field_name = 'vascular_access_desc' AND parent_id = 0").First(&tempConfig)
  1028. switch statistics_type {
  1029. case 1:
  1030. for _, item := range datas {
  1031. var Total int64
  1032. 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)
  1033. item.PunctureCount = Total
  1034. }
  1035. break
  1036. case 2:
  1037. for _, item := range datas {
  1038. var Total int64
  1039. 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)
  1040. item.ChangemedicineCount = Total
  1041. }
  1042. break
  1043. case 3:
  1044. for _, item := range datas {
  1045. var total int64
  1046. 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)
  1047. item.CureCount = total
  1048. }
  1049. break
  1050. case 4:
  1051. for _, item := range datas {
  1052. var Total int64
  1053. 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)
  1054. item.MissionCount = Total
  1055. }
  1056. break
  1057. }
  1058. if err != nil {
  1059. return nil, err
  1060. }
  1061. return datas, nil
  1062. }
  1063. func GetNurseWorkloadTableData(user_org_id int64, start_time int64, end_time int64, admin_user_id int64) (datas []*VMUserAdminRole, err error) {
  1064. userDb := service.UserReadDB()
  1065. db := service.XTReadDB()
  1066. var tempConfig models.Dataconfig
  1067. db.Model(&models.Dataconfig{}).Where("name = '血管通路' AND module = 'hemodialysis' AND field_name = 'vascular_access_desc' AND parent_id = 0").First(&tempConfig)
  1068. if admin_user_id == 0 {
  1069. 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)
  1070. } else {
  1071. 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)
  1072. }
  1073. for _, item := range datas {
  1074. var Total int64
  1075. var TotalOne int64
  1076. var TotalTwo int64
  1077. var TotalThree int64
  1078. 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)
  1079. 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)
  1080. 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)
  1081. 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)
  1082. item.PunctureCount = Total
  1083. item.ChangemedicineCount = TotalOne
  1084. item.PCount = Total
  1085. item.CureCount = TotalTwo
  1086. item.MissionCount = TotalThree
  1087. }
  1088. if err != nil {
  1089. return nil, err
  1090. }
  1091. return datas, nil
  1092. }
  1093. //工作量统计
  1094. type AdminUser struct {
  1095. ID int64 `gorm:"column:id" json:"id" form:"id"`
  1096. AdminUserId int64 `gorm:"column:admin_user_id" json:"admin_user_id" form:"admin_user_id"`
  1097. OrgId int64 `gorm:"column:org_id" json:"org_id" form:"org_id"`
  1098. UserName string `gorm:"column:user_name" json:"user_name" form:"user_name"`
  1099. UserType int64 `gorm:"column:user_type" json:"user_type" form:"user_type"`
  1100. }
  1101. func GetAllAdminUser(user_org_id int64) (datas []*AdminUser, err error) {
  1102. userDb := service.UserReadDB()
  1103. 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)
  1104. return datas, nil
  1105. }
  1106. func FindOrgInspectionCount(user_org_id int64) (count int64, err error) {
  1107. db := service.XTReadDB()
  1108. err = db.Model(&models.InspectionReference{}).Where("status = 1 AND org_id = ?", user_org_id).Count(&count).Error
  1109. return
  1110. }
  1111. func FindOrgInspectionReference(user_org_id int64) (references []*models.InspectionReference, err error) {
  1112. db := service.XTReadDB()
  1113. 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
  1114. return
  1115. }
  1116. func FindProcjectInspectionReference(user_org_id int64, project_id int64, item_id int64) (references models.InspectionReference, err error) {
  1117. db := service.XTReadDB()
  1118. 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
  1119. return
  1120. }
  1121. func FindOrgInspectionReferenceRangeTypeValue(user_org_id int64, project_id int64, item_id int64) (inspection []*models.Inspection, err error) {
  1122. db := service.XTReadDB()
  1123. 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
  1124. return
  1125. }
  1126. func FindOrgConfigRangeTypeValue(user_org_id int64, project_id int64, item_id int64) (qcs QualityControlStandard, err error) {
  1127. db := service.XTReadDB()
  1128. 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
  1129. return
  1130. }
  1131. 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) {
  1132. db := service.XTReadDB()
  1133. var items []*otherItemAmount
  1134. var tempErr error
  1135. var Total int64
  1136. selectContent := "CASE"
  1137. range_value_arr := strings.Split(range_value, ",")
  1138. 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).Count(&Total)
  1139. if range_type == 1 {
  1140. 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).
  1141. Select("CASE WHEN inspect_value < " + range_value_arr[0] + "THEN" + "'" + "小于" + range_value_arr[0] + "'" +
  1142. " WHEN inspect_value >= " + range_value_arr[0] + "AND inspect_value <= " + range_value_arr[1] + " THEN " + "'" + range_value_arr[0] + "~" + range_value_arr[1] + "'" +
  1143. " WHEN inspect_value > " + range_value_arr[1] + "THEN " + "'" + "大于" + range_value_arr[1] + "'" +
  1144. " ELSE '未知' END AS name, COUNT(*) AS total",
  1145. ).Group("name").Scan(&items).Error
  1146. var isHasConditionOne bool = false
  1147. var isHasConditionTwo bool = false
  1148. var isHasConditionThree bool = false
  1149. for _, item := range items {
  1150. if item.Name == "大于"+range_value_arr[1] {
  1151. isHasConditionOne = true
  1152. }
  1153. if item.Name == "小于"+range_value_arr[0] {
  1154. isHasConditionTwo = true
  1155. }
  1156. if item.Name == range_value_arr[0]+"~"+range_value_arr[1] {
  1157. isHasConditionThree = true
  1158. }
  1159. }
  1160. if !isHasConditionOne {
  1161. newItem := &otherItemAmount{
  1162. Total: 0,
  1163. Name: "大于" + range_value_arr[1],
  1164. Ratio: "0",
  1165. }
  1166. items = append(items, newItem)
  1167. }
  1168. if !isHasConditionTwo {
  1169. newItem := &otherItemAmount{
  1170. Total: 0,
  1171. Name: "小于" + range_value_arr[0],
  1172. Ratio: "0",
  1173. }
  1174. items = append(items, newItem)
  1175. }
  1176. if !isHasConditionThree {
  1177. newItem := &otherItemAmount{
  1178. Total: 0,
  1179. Name: range_value_arr[0] + "~" + range_value_arr[1],
  1180. Ratio: "0",
  1181. }
  1182. items = append(items, newItem)
  1183. }
  1184. for _, item := range items {
  1185. if math.IsNaN(float64(item.Total) / float64(Total)) {
  1186. item.Ratio = "0"
  1187. } else {
  1188. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  1189. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  1190. }
  1191. }
  1192. return items, tempErr
  1193. } else {
  1194. for _, item := range range_value_arr {
  1195. //selectContent = selectContent + " WHEN inspect_value =" + item + " THEN " + "'" + item + "'"
  1196. selectContent = selectContent + " WHEN inspect_value =" + "'" + item + "'" + " THEN " + "'" + item + "'"
  1197. }
  1198. 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).
  1199. Select(selectContent +
  1200. " ELSE '未知' END AS name, COUNT(*) AS total",
  1201. ).Group("name").Scan(&items).Error
  1202. for _, item := range items {
  1203. if math.IsNaN(float64(item.Total) / float64(Total)) {
  1204. item.Ratio = "0"
  1205. } else {
  1206. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  1207. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  1208. }
  1209. }
  1210. return items, tempErr
  1211. }
  1212. }
  1213. type Inspection struct {
  1214. ID int64 `gorm:"column:id" json:"id" form:"id"`
  1215. PatientId int64 `gorm:"column:patient_id" json:"patient_id" form:"patient_id"`
  1216. OrgId int64 `gorm:"column:org_id" json:"org_id" form:"org_id"`
  1217. ProjectId int64 `gorm:"column:project_id" json:"project_id" form:"project_id"`
  1218. ItemId int64 `gorm:"column:item_id" json:"item_id" form:"item_id"`
  1219. ItemName string `gorm:"column:item_name" json:"item_name" form:"item_name"`
  1220. ProjectName string `gorm:"column:project_name" json:"project_name" form:"project_name"`
  1221. InspectType int64 `gorm:"column:inspect_type" json:"inspect_type" form:"inspect_type"`
  1222. InspectValue string `gorm:"column:inspect_value" json:"inspect_value" form:"inspect_value"`
  1223. InspectDate int64 `gorm:"column:inspect_date" json:"inspect_date" form:"inspect_date"`
  1224. Status int64 `gorm:"column:status" json:"status" form:"status"`
  1225. CreatedTime int64 `gorm:"column:created_time" json:"created_time" form:"created_time"`
  1226. UpdatedTime int64 `gorm:"column:updated_time" json:"updated_time" form:"updated_time"`
  1227. Patient models.Patients `gorm:"ForeignKey:ID;AssociationForeignKey:PatientId" json:"patient"`
  1228. }
  1229. func (Inspection) TableName() string {
  1230. return "xt_inspection"
  1231. }
  1232. 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) {
  1233. if range_type == 1 {
  1234. index := strings.Index(range_value, "小于")
  1235. indexTwo := strings.Index(range_value, "大于")
  1236. indexThree := strings.Index(range_value, "~")
  1237. if index != -1 {
  1238. value, _ := strconv.ParseFloat(strings.Replace(range_value, "小于", "", 1), 64)
  1239. db := service.XTReadDB()
  1240. offset := (page - 1) * limit
  1241. 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 {
  1242. return db.Where("status = 1 AND user_org_id = ?", user_org_id)
  1243. }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error
  1244. return datas, total, err
  1245. } else if indexTwo != -1 {
  1246. value, _ := strconv.ParseFloat(strings.Replace(range_value, "大于", "", 1), 64)
  1247. db := service.XTReadDB()
  1248. offset := (page - 1) * limit
  1249. 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 {
  1250. return db.Where("status = 1 AND user_org_id = ?", user_org_id)
  1251. }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error
  1252. return datas, total, err
  1253. } else if indexThree != -1 {
  1254. range_value_arr := strings.Split(range_value, "~")
  1255. fmt.Println(range_value_arr)
  1256. float1, err := strconv.ParseFloat(range_value_arr[0], 64)
  1257. float2, err := strconv.ParseFloat(range_value_arr[1], 64)
  1258. fmt.Println(err)
  1259. fmt.Println(float1)
  1260. fmt.Println(float2)
  1261. db := service.XTReadDB()
  1262. offset := (page - 1) * limit
  1263. 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 {
  1264. return db.Where("status = 1 AND user_org_id = ?", user_org_id)
  1265. }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error
  1266. return datas, total, err
  1267. } else {
  1268. db := service.XTReadDB()
  1269. offset := (page - 1) * limit
  1270. 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 {
  1271. return db.Where("status = 1 AND user_org_id = ?", user_org_id)
  1272. }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error
  1273. return datas, total, err
  1274. }
  1275. } else {
  1276. if range_value == "全部" {
  1277. db := service.XTReadDB()
  1278. offset := (page - 1) * limit
  1279. 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 {
  1280. return db.Where("status = 1 AND user_org_id = ?", user_org_id)
  1281. }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error
  1282. return datas, total, err
  1283. } else {
  1284. db := service.XTReadDB()
  1285. offset := (page - 1) * limit
  1286. 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 {
  1287. return db.Where("status = 1 AND user_org_id = ?", user_org_id)
  1288. }).Count(&total).Offset(offset).Limit(limit).Find(&datas).Error
  1289. return datas, total, err
  1290. }
  1291. }
  1292. }
  1293. type NewIndexDataStruct struct {
  1294. Date string `json:"date"`
  1295. Value string `json:"value"`
  1296. }
  1297. 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) {
  1298. db := service.XTReadDB()
  1299. 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
  1300. if err != nil {
  1301. return nil, err
  1302. }
  1303. return datas, nil
  1304. }
  1305. 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) {
  1306. db := service.XTReadDB()
  1307. var items []*otherItemAmount
  1308. var tempErr error
  1309. selectContent := "CASE"
  1310. range_value_arr := strings.Split(range_value, ",")
  1311. if range_type == 1 {
  1312. 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).
  1313. Select("CASE WHEN inspect_value < " + range_value_arr[0] + "THEN" + "'" + "小于" + range_value_arr[0] + "'" +
  1314. " WHEN inspect_value >= " + range_value_arr[0] + "AND inspect_value <= " + range_value_arr[1] + " THEN " + "'" + range_value_arr[0] + "~" + range_value_arr[1] + "'" +
  1315. " WHEN inspect_value > " + range_value_arr[1] + "THEN " + "'" + "大于" + range_value_arr[1] + "'" +
  1316. " ELSE '未知' END AS name, COUNT(*) AS total",
  1317. ).Group("name").Scan(&items).Error
  1318. var isHasConditionOne bool = false
  1319. var isHasConditionTwo bool = false
  1320. var isHasConditionThree bool = false
  1321. for _, item := range items {
  1322. if item.Name == "大于"+range_value_arr[1] {
  1323. isHasConditionOne = true
  1324. }
  1325. if item.Name == "小于"+range_value_arr[0] {
  1326. isHasConditionTwo = true
  1327. }
  1328. if item.Name == range_value_arr[0]+"~"+range_value_arr[1] {
  1329. isHasConditionThree = true
  1330. }
  1331. }
  1332. if !isHasConditionOne {
  1333. newItem := &otherItemAmount{
  1334. Total: 0,
  1335. Name: "大于" + range_value_arr[1],
  1336. Ratio: "0",
  1337. }
  1338. items = append(items, newItem)
  1339. }
  1340. if !isHasConditionTwo {
  1341. newItem := &otherItemAmount{
  1342. Total: 0,
  1343. Name: "小于" + range_value_arr[0],
  1344. Ratio: "0",
  1345. }
  1346. items = append(items, newItem)
  1347. }
  1348. if !isHasConditionThree {
  1349. newItem := &otherItemAmount{
  1350. Total: 0,
  1351. Name: range_value_arr[0] + "~" + range_value_arr[1],
  1352. Ratio: "0",
  1353. }
  1354. items = append(items, newItem)
  1355. }
  1356. return items, tempErr
  1357. } else {
  1358. for _, item := range range_value_arr {
  1359. selectContent = selectContent + " WHEN inspect_value =" + "'" + item + "'" + " THEN " + "'" + item + "'"
  1360. }
  1361. 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).
  1362. Select(selectContent +
  1363. " ELSE '未知' END AS name, COUNT(*) AS total",
  1364. ).Group("name").Scan(&items).Error
  1365. return items, tempErr
  1366. }
  1367. }