statistis_qc_service.go 151KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052
  1. package service
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "log"
  6. "math"
  7. "reflect"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "XT_New/models"
  12. "github.com/jinzhu/gorm"
  13. )
  14. func GetDialysisTotalDatas() {
  15. }
  16. func GetNewDialysiTotal(startime int64, endtime int64, orgid int64, origin int64) (int64, error) {
  17. counts := models.PatientPrescriptionCountStruct{}
  18. var err error
  19. if origin == 1 { //透析记录,上机为准
  20. db := XTReadDB().Table("xt_dialysis_order as x").Joins("join xt_dialysis_prescription p on p.patient_id = x.patient_id and p.record_date = x.dialysis_date")
  21. err = db.Select("count(x.id) as count").Where("x.dialysis_date >= ? and x.dialysis_date<=? and x.user_org_id = ? AND x.status = 1 and x.stage = 2", startime, endtime, orgid).Scan(&counts).Error
  22. return counts.Count, err
  23. } else {
  24. var count int64
  25. var schs []models.Schedule
  26. db := XTReadDB().Model(&models.Schedule{})
  27. err := db.
  28. Group("patient_id, schedule_date").
  29. Where("schedule_date >= ? AND schedule_date <= ? and user_org_id = ? and status = 1", startime, endtime, orgid).
  30. Find(&schs).
  31. Error
  32. count = int64(len(schs))
  33. return count, err
  34. }
  35. }
  36. type TreatmentMode struct {
  37. ModeID int `json:"mode_id"`
  38. ModeName string `json:"mode_name"`
  39. }
  40. type DialysisStat struct {
  41. Date string `json:"日期"`
  42. Counts map[string]int `json:"counts"`
  43. Total int `json:"合计"`
  44. }
  45. func GetTreatmentModes(org_id int64, start string, end string) (mode []models.MewTreatmentMode) {
  46. //XTReadDB().Model(&models.HisPrescription{}).Joins("join xt_treatment_mode mode on").Where("user_org_id = ?", org_id).Find(&modes).Error
  47. XTReadDB().Table("xt_dialysis_prescription p").Joins("join xt_treatment_mode mode on mode.id = p.mode_id").Where("p.user_org_id = ? and FROM_UNIXTIME(p.record_date) >= ? AND FROM_UNIXTIME(p.record_date) <= ?", org_id, start, end).Select("mode.name as name, p.mode_id as mode_id").Group("p.mode_id").Scan(&mode)
  48. return
  49. }
  50. func GetDialysisStats(start int64, end int64, mode int64, org_id int64, time_way int64) ([]map[string]interface{}, error) {
  51. // 将时间戳转换为time.Time类型
  52. t := time.Unix(start, 0)
  53. // 使用布局定义格式化时间
  54. layout := "2006-01-02"
  55. // 将时间格式化为字符串
  56. startDate := t.Format(layout) + " 00:00:00"
  57. t2 := time.Unix(end, 0)
  58. // 使用布局定义格式化时间
  59. //layout := "2006-01-02"
  60. // 将时间格式化为字符串
  61. endDate := t2.Format(layout) + " 00:00:00"
  62. //var stats []DialysisStat
  63. var modes []models.MewTreatmentMode
  64. fmt.Println(mode)
  65. if mode == 0 {
  66. modes = GetTreatmentModes(org_id, startDate, endDate)
  67. } else {
  68. modes_two := GetTreatmentModes(org_id, startDate, endDate)
  69. for _, item := range modes_two {
  70. if item.ModeID == mode {
  71. modes = append(modes, item)
  72. }
  73. }
  74. }
  75. // 获取透析模式
  76. if err != nil {
  77. return nil, err
  78. }
  79. var selectClauses []string
  80. // 构建动态查询语句
  81. if time_way == 1 {
  82. //selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0])}
  83. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0])}
  84. } else if time_way == 3 {
  85. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  86. //selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0]+"-"+strings.Split(strings.Split(startDate, " ")[0], "-")[1])}
  87. } else if time_way == 4 {
  88. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  89. //selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0])}
  90. } else {
  91. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  92. }
  93. for _, mode := range modes {
  94. fmt.Println(mode)
  95. selectClauses = append(selectClauses, fmt.Sprintf("COALESCE(SUM(CASE WHEN t.name = '%s' THEN 1 ELSE 0 END), 0) AS `%s`", mode.Name, mode.Name))
  96. }
  97. selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
  98. var rows *sql.Rows
  99. var query string
  100. if mode > 0 {
  101. query = fmt.Sprintf(`
  102. SELECT
  103. %s
  104. FROM
  105. xt_dialysis_prescription p
  106. JOIN
  107. xt_treatment_mode t ON p.mode_id = t.mode_id
  108. WHERE
  109. FROM_UNIXTIME(p.record_date) >= ? AND FROM_UNIXTIME(p.record_date) <= ? AND p.user_org_id = ? and p.mode_id = ? and p.status=1
  110. GROUP BY
  111. 日期
  112. `, strings.Join(selectClauses, ", "))
  113. rows, _ = readDb.Raw(query, startDate, endDate, org_id, mode).Rows()
  114. } else {
  115. query = fmt.Sprintf(`
  116. SELECT
  117. %s
  118. FROM
  119. xt_dialysis_prescription p
  120. JOIN
  121. xt_treatment_mode t ON p.mode_id = t.mode_id
  122. WHERE
  123. FROM_UNIXTIME(p.record_date) >= ? AND FROM_UNIXTIME(p.record_date) <= ? AND p.user_org_id = ? and p.status=1
  124. GROUP BY
  125. 日期
  126. `, strings.Join(selectClauses, ", "))
  127. rows, _ = readDb.Raw(query, startDate, endDate, org_id).Rows()
  128. }
  129. if err != nil {
  130. return nil, err
  131. }
  132. defer rows.Close()
  133. columns, err := rows.Columns()
  134. if err != nil {
  135. return nil, err
  136. }
  137. var results []map[string]interface{}
  138. for rows.Next() {
  139. // 创建一个长度为列数的切片,用于存储每一行的值
  140. columnValues := make([]interface{}, len(columns))
  141. columnPointers := make([]interface{}, len(columns))
  142. for i := range columnValues {
  143. columnPointers[i] = &columnValues[i]
  144. }
  145. // 扫描当前行的值
  146. if err := rows.Scan(columnPointers...); err != nil {
  147. return nil, err
  148. }
  149. // 将扫描到的值放入结果 map 中
  150. result := make(map[string]interface{})
  151. for i, colName := range columns {
  152. val := columnPointers[i].(*interface{})
  153. result[colName] = *val
  154. }
  155. results = append(results, result)
  156. }
  157. //// 解析查询结果
  158. //for rows.Next() {
  159. // var stat DialysisStat
  160. // stat.Counts = make(map[string]int)
  161. // cols := []interface{}{&stat.Date}
  162. // for _, mode := range modes {
  163. // var count int
  164. // cols = append(cols, &count)
  165. // stat.Counts[mode.Name] = count
  166. // }
  167. // var total int
  168. // cols = append(cols, &total)
  169. // stat.Total = total
  170. // if err := rows.Scan(cols...); err != nil {
  171. // return nil, err
  172. // }
  173. // stats = append(stats, stat)
  174. //}
  175. return results, nil
  176. }
  177. func GetScheduleStats(start int64, end int64, mode int64, org_id int64, time_way int64) ([]map[string]interface{}, error) {
  178. // 将时间戳转换为time.Time类型
  179. t := time.Unix(start, 0)
  180. // 使用布局定义格式化时间
  181. layout := "2006-01-02"
  182. // 将时间格式化为字符串
  183. startDate := t.Format(layout) + " 00:00:00"
  184. t2 := time.Unix(end, 0)
  185. // 使用布局定义格式化时间
  186. //layout := "2006-01-02"
  187. // 将时间格式化为字符串
  188. endDate := t2.Format(layout) + " 00:00:00"
  189. //var stats []DialysisStat
  190. var modes []models.MewTreatmentMode
  191. fmt.Println(mode)
  192. if mode == 0 {
  193. modes = GetTreatmentModes(org_id, startDate, endDate)
  194. } else {
  195. modes_two := GetTreatmentModes(org_id, startDate, endDate)
  196. for _, item := range modes_two {
  197. if item.ModeID == mode {
  198. modes = append(modes, item)
  199. }
  200. }
  201. }
  202. // 获取透析模式
  203. if err != nil {
  204. return nil, err
  205. }
  206. var selectClauses []string
  207. // 构建动态查询语句
  208. if time_way == 1 {
  209. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0])}
  210. } else if time_way == 3 {
  211. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0]+strings.Split(strings.Split(startDate, " ")[0], "-")[1])}
  212. } else if time_way == 4 {
  213. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0])}
  214. } else {
  215. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  216. }
  217. for _, mode := range modes {
  218. fmt.Println(mode)
  219. selectClauses = append(selectClauses, fmt.Sprintf("COALESCE(SUM(CASE WHEN t.name = '%s' THEN 1 ELSE 0 END), 0) AS `%s`", mode.Name, mode.Name))
  220. }
  221. selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
  222. var rows *sql.Rows
  223. var query string
  224. if mode > 0 {
  225. query = fmt.Sprintf(`
  226. SELECT
  227. %s
  228. FROM
  229. xt_schedule p
  230. JOIN
  231. xt_treatment_mode t ON p.mode_id = t.mode_id
  232. WHERE
  233. FROM_UNIXTIME(p.schedule_date) >= ? AND FROM_UNIXTIME(p.schedule_date) <= ? AND p.user_org_id = ? and p.mode_id = ? and p.status = 1
  234. GROUP BY
  235. 日期
  236. `, strings.Join(selectClauses, ", "))
  237. rows, _ = readDb.Raw(query, startDate, endDate, org_id, mode).Rows()
  238. } else {
  239. query = fmt.Sprintf(`
  240. SELECT
  241. %s
  242. FROM
  243. xt_schedule p
  244. JOIN
  245. xt_treatment_mode t ON p.mode_id = t.mode_id
  246. WHERE
  247. FROM_UNIXTIME(p.schedule_date) >= ? AND FROM_UNIXTIME(p.schedule_date) <= ? AND p.user_org_id = ? and p.status = 1
  248. GROUP BY
  249. 日期
  250. `, strings.Join(selectClauses, ", "))
  251. rows, _ = readDb.Raw(query, startDate, endDate, org_id).Rows()
  252. }
  253. if err != nil {
  254. return nil, err
  255. }
  256. defer rows.Close()
  257. columns, err := rows.Columns()
  258. if err != nil {
  259. return nil, err
  260. }
  261. var results []map[string]interface{}
  262. for rows.Next() {
  263. // 创建一个长度为列数的切片,用于存储每一行的值
  264. columnValues := make([]interface{}, len(columns))
  265. columnPointers := make([]interface{}, len(columns))
  266. for i := range columnValues {
  267. columnPointers[i] = &columnValues[i]
  268. }
  269. // 扫描当前行的值
  270. if err := rows.Scan(columnPointers...); err != nil {
  271. return nil, err
  272. }
  273. // 将扫描到的值放入结果 map 中
  274. result := make(map[string]interface{})
  275. for i, colName := range columns {
  276. val := columnPointers[i].(*interface{})
  277. result[colName] = *val
  278. }
  279. results = append(results, result)
  280. }
  281. //// 解析查询结果
  282. //for rows.Next() {
  283. // var stat DialysisStat
  284. // stat.Counts = make(map[string]int)
  285. // cols := []interface{}{&stat.Date}
  286. // for _, mode := range modes {
  287. // var count int
  288. // cols = append(cols, &count)
  289. // stat.Counts[mode.Name] = count
  290. // }
  291. // var total int
  292. // cols = append(cols, &total)
  293. // stat.Total = total
  294. // if err := rows.Scan(cols...); err != nil {
  295. // return nil, err
  296. // }
  297. // stats = append(stats, stat)
  298. //}
  299. return results, nil
  300. }
  301. //func GetScheduleStats(startDate int64, endDate int64, groupBy int64, mode int64, org_id int64) ([]DialysisStat, error) {
  302. // var stats []DialysisStat
  303. // var modes []models.TreatmentMode
  304. // if mode > 0 {
  305. // modes, _ = GetTreatmentModes()
  306. // } else {
  307. // modes_two, _ := GetTreatmentModes()
  308. // for _, item := range modes_two {
  309. // if item.ModeID == mode {
  310. // modes = append(modes, item)
  311. // }
  312. // }
  313. // }
  314. // // 获取透析模式
  315. // if err != nil {
  316. // return nil, err
  317. // }
  318. //
  319. // // 构建日期格式
  320. // dateFormat := "%Y-%m-%d"
  321. // switch groupBy {
  322. // case 2:
  323. // dateFormat = "%Y-%m-%d"
  324. // case 1:
  325. // dateFormat = "%Y-%u"
  326. // case 3:
  327. // dateFormat = "%Y-%m"
  328. // case 4:
  329. // dateFormat = "%Y"
  330. // default:
  331. // return nil, fmt.Errorf("invalid group by option")
  332. // }
  333. // // 构建动态查询语句
  334. // selectClauses := []string{fmt.Sprintf("DATE_FORMAT(p.schudle_date, '%s') AS `日期`", dateFormat)}
  335. // for _, mode := range modes {
  336. // selectClauses = append(selectClauses, fmt.Sprintf("SUM(CASE WHEN t.mode_name = '%s' THEN 1 ELSE 0 END) AS `%s`", mode.Name, mode.Name))
  337. // }
  338. // selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
  339. //
  340. // query := fmt.Sprintf(`
  341. // SELECT
  342. // %s
  343. // FROM
  344. // xt_schedule p
  345. // JOIN
  346. // xt_treatment_mode t ON p.mode_id = t.mode_id
  347. // WHERE
  348. // p.schedule_date >= ? AND p.schedule_date <= ?
  349. // GROUP BY
  350. // DATE_FORMAT(p.schedule_date, '%s')
  351. // `, dateFormat, dateFormat, selectClauses)
  352. //
  353. // rows, err := readDb.Raw(query, startDate, endDate).Rows()
  354. // if err != nil {
  355. // return nil, err
  356. // }
  357. // defer rows.Close()
  358. //
  359. // // 解析查询结果
  360. // for rows.Next() {
  361. // var stat DialysisStat
  362. // stat.Counts = make(map[string]int)
  363. // cols := []interface{}{&stat.Date}
  364. // for _, mode := range modes {
  365. // var count int
  366. // cols = append(cols, &count)
  367. // stat.Counts[mode.Name] = count
  368. // }
  369. // var total int
  370. // cols = append(cols, &total)
  371. // stat.Total = total
  372. // if err := rows.Scan(cols...); err != nil {
  373. // return nil, err
  374. // }
  375. // stats = append(stats, stat)
  376. // }
  377. //
  378. // return stats, nil
  379. //}
  380. func GetNewDialysisCountMode(starttime int64, endtime int64, orgid int64, origin int64, mode_id int64) (counts []*models.PatientPrescriptionCountStruct, err error) {
  381. if origin == 1 {
  382. db := readDb.Table("xt_dialysis_order as o").Where("o.status = 1")
  383. if starttime > 0 {
  384. db = db.Where("o.dialysis_date >=?", starttime)
  385. }
  386. if endtime > 0 {
  387. db = db.Where("o.dialysis_date<=?", endtime)
  388. }
  389. if orgid > 0 {
  390. db = db.Where("o.user_org_id = ?", orgid)
  391. }
  392. db = db.Where("o.stage = 2")
  393. if mode_id == 0 {
  394. err = db.Select("s.mode_id,count(s.mode_id) as count").Joins("join xt_dialysis_prescription as s on s.patient_id = o.patient_id and s.record_date = o.dialysis_date and s.status= 1 AND s.record_date >= ? AND s.record_date <= ? AND s.mode_id > 0", starttime, endtime).Group("s.mode_id").Scan(&counts).Error
  395. } else {
  396. err = db.Select("s.mode_id,count(s.mode_id) as count").Joins("join xt_dialysis_prescription as s on s.patient_id = o.patient_id and s.record_date = o.dialysis_date and s.status= 1 AND s.record_date >= ? AND s.record_date <= ? AND s.mode_id = ? ", starttime, endtime, mode_id).Group("s.mode_id").Scan(&counts).Error
  397. }
  398. return counts, err
  399. } else {
  400. err = readDb.Raw("select mode_id, count(aa.`mode_id`) as count from xt_schedule aa join (SELECT DISTINCT o.patient_id, o.`schedule_date` FROM xt_schedule AS o WHERE o.status = 1 AND o.schedule_date >= ? AND o.schedule_date <= ? AND o.user_org_id = ?) as b on aa.`patient_id` = b.`patient_id` and aa.`schedule_date` = b.`schedule_date` where aa.`status` = 1 and aa.schedule_date >= ? AND aa.schedule_date <= ? AND aa.user_org_id = ? Group by aa.`mode_id`", starttime, endtime, orgid, starttime, endtime, orgid).Find(&counts).Error
  401. return counts, err
  402. }
  403. }
  404. func GetNewDialysisCountModeTwo(starttime int64, endtime int64, orgid int64, origin int64, mode_id int64) (counts models.CustomDialysisData, err error) {
  405. // 将时间戳转换为time.Time类型
  406. t := time.Unix(starttime, 0)
  407. // 使用布局定义格式化时间
  408. layout := "2006-01-02"
  409. // 将时间格式化为字符串
  410. startDate := t.Format(layout) + " 00:00:00"
  411. t2 := time.Unix(endtime, 0)
  412. // 使用布局定义格式化时间
  413. //layout := "2006-01-02"
  414. // 将时间格式化为字符串
  415. endDate := t2.Format(layout) + " 00:00:00"
  416. //fmt.Println(formattedDate)
  417. // 将日期字符串解析为time.Time类型
  418. //start, _ := time.Parse("2006-01-02 15:04:05", formattedDate)
  419. //starttime = start.Unix()
  420. //fmt.Println(starttime)
  421. if origin == 1 {
  422. db := readDb.Table("xt_dialysis_order as o").Where("o.status = 1")
  423. if starttime > 0 {
  424. db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.dialysis_date), '%Y-%m-%d %H:%i:%s') >= ?", startDate)
  425. }
  426. if endtime > 0 {
  427. db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.dialysis_date), '%Y-%m-%d %H:%i:%s') <= ?", endDate)
  428. }
  429. if orgid > 0 {
  430. db = db.Where("o.user_org_id = ?", orgid)
  431. }
  432. db = db.Where("o.stage = 2")
  433. err = db.Select("s.mode_id,count(s.mode_id) as count").Joins("join xt_dialysis_prescription as s on s.patient_id = o.patient_id and s.record_date = o.dialysis_date and s.status= 1 AND DATE_FORMAT(FROM_UNIXTIME(s.record_date), '%Y-%m-%d %H:%i:%s') >= ? AND DATE_FORMAT(FROM_UNIXTIME(s.record_date), '%Y-%m-%d %H:%i:%s') <= ? AND s.mode_id = ? ", startDate, endDate, mode_id).Group("s.mode_id").Scan(&counts).Error
  434. return counts, err
  435. } else {
  436. db := readDb.Table("xt_schedule as o").Where("o.status = 1").Select("patient_id, schedule_date").Group("mode_id")
  437. if starttime > 0 {
  438. db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.schedule_date),'%Y-%m-%d %H:%i:%s') >= ?", startDate)
  439. }
  440. if endtime > 0 {
  441. db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.schedule_date),'%Y-%m-%d %H:%i:%s') <= ?", endDate)
  442. }
  443. if orgid > 0 {
  444. db = db.Where("o.user_org_id = ?", orgid)
  445. }
  446. if mode_id > 0 {
  447. db = db.Where("o.mode_id = ?", mode_id)
  448. }
  449. err = db.Select("o.mode_id,count(o.mode_id) as count").Scan(&counts).Error
  450. return counts, err
  451. }
  452. }
  453. var anticoagulantMap = map[int]string{
  454. 1: "无肝素",
  455. 2: "普通肝素",
  456. 3: "低分子肝素",
  457. 4: "阿加曲班",
  458. 5: "枸橼酸钠",
  459. 6: "低分子肝素钙",
  460. 7: "低分子肝素钠",
  461. 8: "依诺肝素",
  462. 9: "达肝素",
  463. 10: "体外抗凝",
  464. 11: "那屈肝素",
  465. 12: "无抗凝剂",
  466. 13: "那屈肝素钙",
  467. 14: "肝素钙注射液",
  468. 15: "甲磺酸萘莫司他",
  469. 16: "低分子量肝素钙",
  470. 17: "肝素钠",
  471. }
  472. func GetAnticoagulantData(start_time int64, end_time int64, org_id int64) (map[string]int, error) {
  473. var results []struct {
  474. Anticoagulant int
  475. Count int
  476. }
  477. err := XTReadDB().Model(&models.DialysisPrescription{}).Joins("join xt_dialysis_order oo on oo.patient_id = xt_dialysis_prescription.patient_id and oo.dialysis_date = xt_dialysis_prescription.record_date and oo.status = 1").
  478. Select("xt_dialysis_prescription.anticoagulant, COUNT(*) as count").
  479. Where("xt_dialysis_prescription.status = 1 and xt_dialysis_prescription.record_date >= ? and xt_dialysis_prescription.record_date <= ? and xt_dialysis_prescription.user_org_id = ?", start_time, end_time, org_id).
  480. Group("xt_dialysis_prescription.anticoagulant").
  481. Scan(&results).Error
  482. if err != nil {
  483. return nil, err
  484. }
  485. anticoagulantData := make(map[string]int)
  486. for _, result := range results {
  487. if name, ok := anticoagulantMap[result.Anticoagulant]; ok {
  488. anticoagulantData[name] = result.Count
  489. }
  490. //else {
  491. // anticoagulantData[fmt.Sprintf("Unknown (%d)", result.Anticoagulant)] = result.Count
  492. //}z
  493. }
  494. return anticoagulantData, nil
  495. }
  496. func GetAnticoagulantTotal(start_time int64, end_time int64, org_id int64) (total int64, err error) {
  497. err = XTReadDB().Model(&models.DialysisPrescription{}).Joins("join xt_dialysis_order oo on oo.patient_id = xt_dialysis_prescription.patient_id and oo.dialysis_date = xt_dialysis_prescription.record_date and oo.status = 1").
  498. Where("xt_dialysis_prescription.record_date >= ? and xt_dialysis_prescription.record_date <= ? and xt_dialysis_prescription.user_org_id = ? and xt_dialysis_prescription.status = 1", start_time, end_time, org_id).
  499. Count(&total).Error
  500. return
  501. }
  502. func GetDialyzerSummary(org_id int64) ([]models.DialysisPrescription, error) {
  503. var Dialyzer []models.DialysisPrescription
  504. err := XTReadDB().Model(&models.DialysisPrescription{}).
  505. Select("dialysis_dialyszers").
  506. Where(" user_org_id = ? and status = 1 and dialysis_dialyszers <> ''", org_id).
  507. Group("dialysis_dialyszers").
  508. Find(&Dialyzer).Error
  509. if err != nil {
  510. return nil, err
  511. }
  512. return Dialyzer, nil
  513. }
  514. func GetIrrigationSummary(org_id int64) ([]models.DialysisPrescription, error) {
  515. var Dialyzer []models.DialysisPrescription
  516. err := XTReadDB().Model(&models.DialysisPrescription{}).
  517. Select("dialysis_irrigation").
  518. Where(" user_org_id = ? and status = 1 and dialysis_irrigation <> ''", org_id).
  519. Group("dialysis_irrigation").
  520. Find(&Dialyzer).Error
  521. if err != nil {
  522. return nil, err
  523. }
  524. return Dialyzer, nil
  525. }
  526. func GetDialysisStrainerSummary(org_id int64) ([]models.DialysisPrescription, error) {
  527. var Dialyzer []models.DialysisPrescription
  528. err := XTReadDB().Model(&models.DialysisPrescription{}).
  529. Select("dialysis_strainer").
  530. Where(" user_org_id = ? and status = 1 and dialysis_strainer <> ''", org_id).
  531. Group("dialysis_strainer").
  532. Find(&Dialyzer).Error
  533. if err != nil {
  534. return nil, err
  535. }
  536. return Dialyzer, nil
  537. }
  538. type DialyzerResult struct {
  539. Dialyzer string
  540. Count int
  541. }
  542. func GetDialyzerData(start_time int64, end_time int64, org_id int64) (dr []DialyzerResult, err error) {
  543. err = XTReadDB().Model(&models.DialysisPrescription{}).Joins("join xt_dialysis_order oo on oo.patient_id = xt_dialysis_prescription.patient_id and oo.dialysis_date = xt_dialysis_prescription.record_date and oo.status = 1").
  544. Select("xt_dialysis_prescription.dialysis_dialyszers as dialyzer, COUNT(*) as count").
  545. Where("xt_dialysis_prescription.record_date >= ? and xt_dialysis_prescription.record_date <= ? and xt_dialysis_prescription.user_org_id = ? and xt_dialysis_prescription.status = 1 and xt_dialysis_prescription.dialysis_dialyszers <> ''", start_time, end_time, org_id).
  546. Group("xt_dialysis_prescription.dialysis_dialyszers").
  547. Scan(&dr).Error
  548. return
  549. }
  550. func GetDialysisIrrigationData(start_time int64, end_time int64, org_id int64) (dr []DialyzerResult, err error) {
  551. err = XTReadDB().Model(&models.DialysisPrescription{}).Joins("join xt_dialysis_order oo on oo.patient_id = xt_dialysis_prescription.patient_id and oo.dialysis_date = xt_dialysis_prescription.record_date and oo.status = 1").
  552. Select("xt_dialysis_prescription.dialysis_irrigation as dialyzer, COUNT(*) as count").
  553. Where("xt_dialysis_prescription.record_date >= ? and xt_dialysis_prescription.record_date <= ? and xt_dialysis_prescription.user_org_id = ? and xt_dialysis_prescription.status = 1 and xt_dialysis_prescription.dialysis_irrigation <> '' ", start_time, end_time, org_id).
  554. Group("xt_dialysis_prescription.dialysis_irrigation").
  555. Scan(&dr).Error
  556. return
  557. }
  558. func GetDialysisStrainerData(start_time int64, end_time int64, org_id int64) (dr []DialyzerResult, err error) {
  559. err = XTReadDB().Model(&models.DialysisPrescription{}).Joins("join xt_dialysis_order oo on oo.patient_id = xt_dialysis_prescription.patient_id and oo.dialysis_date = xt_dialysis_prescription.record_date and oo.status = 1").
  560. Select("xt_dialysis_prescription.dialysis_strainer as dialyzer, COUNT(*) as count").
  561. Where("xt_dialysis_prescription.record_date >= ? and xt_dialysis_prescription.record_date <= ? and xt_dialysis_prescription.user_org_id = ? and xt_dialysis_prescription.status = 1 and xt_dialysis_prescription.dialysis_strainer <> ''", start_time, end_time, org_id).
  562. Group("xt_dialysis_prescription.dialysis_strainer").
  563. Scan(&dr).Error
  564. return
  565. }
  566. func GetIrrigationData(start_time int64, end_time int64, org_id int64) (dr []DialyzerResult, err error) {
  567. err = XTReadDB().Model(&models.DialysisPrescription{}).
  568. Select("dialysis_irrigation as dialyzer, COUNT(*) as count").
  569. Where("record_date >= ? and record_date <= ? and user_org_id = ? and status = 1", start_time, end_time, org_id).
  570. Group("dialysis_irrigation").
  571. Scan(&dr).Error
  572. return
  573. }
  574. func GetDialyzerTotal(start_time int64, end_time int64, org_id int64) (total int64, err error) {
  575. err = XTReadDB().Model(&models.DialysisPrescription{}).Joins("join xt_dialysis_order oo on oo.patient_id = xt_dialysis_prescription.patient_id and oo.dialysis_date = xt_dialysis_prescription.record_date and oo.status = 1").
  576. Where("xt_dialysis_prescription.status = 1 and xt_dialysis_prescription.record_date >= ? and xt_dialysis_prescription.record_date <= ? and xt_dialysis_prescription.user_org_id = ?", start_time, end_time, org_id).
  577. Count(&total).Error
  578. return
  579. }
  580. func GetPrescriptionByAnticoagulant(page int64, limit int64, orgid int64, anticoagulant int64, start_time int64, end_time int64) (solution []*models.DialysisPrescription, total int64, err error) {
  581. db := XTReadDB().Model(&models.DialysisPrescription{}).Joins("join xt_dialysis_order oo on oo.patient_id = xt_dialysis_prescription.patient_id and oo.dialysis_date = xt_dialysis_prescription.record_date and oo.status = 1").Preload("QCPatients", "xt_patients.status = 1 and xt_patients.user_org_id = ?", orgid).Where("xt_dialysis_prescription.status = 1")
  582. if anticoagulant > 0 {
  583. db = db.Where("xt_dialysis_prescription.anticoagulant = ?", anticoagulant)
  584. }
  585. if orgid > 0 {
  586. db = db.Where("xt_dialysis_prescription.user_org_id = ?", orgid)
  587. }
  588. db = db.Where("xt_dialysis_prescription.record_date >= ? and xt_dialysis_prescription.record_date <= ?", start_time, end_time)
  589. offset := (page - 1) * limit
  590. err = db.Count(&total).Offset(offset).Limit(limit).Find(&solution).Error
  591. return solution, total, err
  592. }
  593. func GetPrescriptionByDialyzer(page int64, limit int64, orgid int64, dialyzer string, start_time int64, end_time int64) (solution []*models.DialysisPrescription, total int64, err error) {
  594. db := XTReadDB().Model(&models.DialysisPrescription{}).Joins("join xt_dialysis_order oo on oo.patient_id = xt_dialysis_prescription.patient_id and oo.dialysis_date = xt_dialysis_prescription.record_date and oo.status = 1").Preload("QCPatients", "xt_patients.status = 1 and xt_patients.user_org_id = ?", orgid).Where("xt_dialysis_prescription.status = 1")
  595. if len(dialyzer) > 0 {
  596. db = db.Where("xt_dialysis_prescription.dialysis_dialyszers = ? or xt_dialysis_prescription.dialysis_irrigation = ? or xt_dialysis_prescription.dialysis_strainer = ?", dialyzer, dialyzer, dialyzer)
  597. }
  598. if orgid > 0 {
  599. db = db.Where("xt_dialysis_prescription.user_org_id = ?", orgid)
  600. }
  601. db = db.Where("xt_dialysis_prescription.record_date >= ? and xt_dialysis_prescription.record_date <= ? and xt_dialysis_prescription.status = 1", start_time, end_time)
  602. offset := (page - 1) * limit
  603. err = db.Count(&total).Offset(offset).Limit(limit).Find(&solution).Error
  604. return solution, total, err
  605. }
  606. type DialysisData struct {
  607. DialysisStatus string `json:"dialysis_status"`
  608. Count int `json:"count"`
  609. }
  610. type CustomData struct {
  611. DialysisNo string
  612. PatientName string
  613. DialysisDate string
  614. DialysisDuration string
  615. ActualDuration string
  616. Diff string
  617. Doctor string
  618. Nurse string
  619. }
  620. func GetDialysisCompletionRate(org_id int64, start_time int64, end_time int64) (map[string]int, error) {
  621. var results []DialysisData
  622. query := `
  623. SELECT
  624. CASE
  625. WHEN ABS(TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0))) <= 15 THEN '达到透析处方时间'
  626. WHEN TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0)) < -15 THEN '未达到处方时间'
  627. ELSE '超出处方时间'
  628. END AS dialysis_status,
  629. COUNT(*) AS count
  630. FROM
  631. xt_dialysis_order o
  632. JOIN
  633. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  634. JOIN
  635. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  636. WHERE
  637. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  638. GROUP BY
  639. dialysis_status;
  640. `
  641. if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Scan(&results).Error; err != nil {
  642. return nil, err
  643. }
  644. dialysisCompletionRate := make(map[string]int)
  645. for _, result := range results {
  646. dialysisCompletionRate[result.DialysisStatus] = result.Count
  647. }
  648. return dialysisCompletionRate, nil
  649. }
  650. func GetDialysisCompletionTotal(org_id int64, start_time int64, end_time int64) (int64, error) {
  651. var Count int64
  652. query := `
  653. SELECT
  654. COUNT(*) AS count
  655. FROM
  656. xt_dialysis_order o
  657. JOIN
  658. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  659. JOIN
  660. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  661. WHERE
  662. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  663. `
  664. if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Count(&Count).Error; err != nil {
  665. return 0, err
  666. }
  667. return Count, nil
  668. }
  669. func GetDialysisCompletionDetail(org_id int64, start_time int64, end_time int64, mode int64, limit int64, page int64) (results []interface{}, total int64, err error) {
  670. var query string
  671. if mode == 0 {
  672. query = `
  673. SELECT
  674. pp.dialysis_no as dialysis_no,
  675. pp.name as patient_name,
  676. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  677. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  678. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  679. ABS(TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0))) as diff,
  680. p.prescription_doctor as doctor,
  681. o.finish_nurse as nurse,
  682. pp.id_card_no as id_card_no
  683. FROM
  684. xt_dialysis_order o
  685. JOIN
  686. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  687. JOIN
  688. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  689. JOIN
  690. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  691. WHERE
  692. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  693. `
  694. readDb.Table("xt_dialysis_order o").
  695. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  696. Joins("JOIN xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?", org_id).
  697. Joins("JOIN xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?", org_id).
  698. Where("o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?", org_id, start_time, end_time).Count(&total)
  699. } else if mode == 1 {
  700. query = `
  701. SELECT
  702. pp.dialysis_no as dialysis_no,
  703. pp.name as patient_name,
  704. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  705. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  706. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  707. ABS(TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0))) as diff,
  708. p.prescription_doctor as doctor,
  709. o.finish_nurse as nurse,
  710. pp.id_card_no as id_card_no
  711. FROM
  712. xt_dialysis_order o
  713. JOIN
  714. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  715. JOIN
  716. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  717. JOIN
  718. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  719. WHERE
  720. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ? AND ABS(TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0))) <= 15
  721. `
  722. readDb.Table("xt_dialysis_order o").
  723. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  724. Joins("JOIN xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?", org_id).
  725. Joins("JOIN xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?", org_id).
  726. Where("o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ? and ABS(TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0))) <= 15", org_id, start_time, end_time).Count(&total)
  727. } else if mode == 2 {
  728. query = `
  729. SELECT
  730. pp.dialysis_no as dialysis_no,
  731. pp.name as patient_name,
  732. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  733. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  734. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  735. ABS(TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0))) as diff,
  736. p.prescription_doctor as doctor,
  737. o.finish_nurse as nurse,
  738. pp.id_card_no as id_card_no
  739. FROM
  740. xt_dialysis_order o
  741. JOIN
  742. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  743. JOIN
  744. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  745. JOIN
  746. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  747. WHERE
  748. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ? AND TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0)) > 15
  749. `
  750. readDb.Table("xt_dialysis_order o").
  751. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  752. Joins("JOIN xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?", org_id).
  753. Joins("JOIN xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?", org_id).
  754. Where("o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ? and TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0)) > 15", org_id, start_time, end_time).Count(&total)
  755. } else if mode == 3 {
  756. query = `
  757. SELECT
  758. pp.dialysis_no as dialysis_no,
  759. pp.name as patient_name,
  760. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  761. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  762. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  763. ABS(TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0))) as diff,
  764. p.prescription_doctor as doctor,
  765. o.finish_nurse as nurse,
  766. pp.id_card_no as id_card_no
  767. FROM
  768. xt_dialysis_order o
  769. JOIN
  770. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  771. JOIN
  772. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  773. JOIN
  774. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  775. WHERE
  776. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ? AND TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0)) < -15
  777. `
  778. readDb.Table("xt_dialysis_order o").
  779. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  780. Joins("JOIN xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?", org_id).
  781. Joins("JOIN xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?", org_id).
  782. Where("o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ? and TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0)) < 0", org_id, start_time, end_time).Count(&total)
  783. }
  784. offset := (page - 1) * limit
  785. rows, err := readDb.Raw(query, org_id, org_id, org_id, org_id, start_time, end_time).Offset(offset).Limit(limit).Rows()
  786. if err != nil {
  787. fmt.Println(err)
  788. }
  789. defer rows.Close()
  790. // Define a map to hold the dynamic fields
  791. fields := map[string]interface{}{
  792. "dialysis_no": "",
  793. "patient_name": "",
  794. "dialysis_date": "",
  795. "dialysis_duration": "",
  796. "actual_duration": "",
  797. "diff": 0,
  798. "doctor": "",
  799. "nurse": "",
  800. "id_card_no": "",
  801. }
  802. // Create the dynamic struct type
  803. dynamicStructType := createDynamicStruct(fields)
  804. // Slice to hold the results
  805. //var results []interface{}
  806. // Iterate over the rows and scan into the dynamic struct
  807. for rows.Next() {
  808. // Create a new instance of the dynamic struct
  809. result := reflect.New(dynamicStructType).Interface()
  810. // Create a slice of pointers to the fields in the struct
  811. fieldPtrs := []interface{}{
  812. reflect.ValueOf(result).Elem().FieldByName("Dialysis_no").Addr().Interface(),
  813. reflect.ValueOf(result).Elem().FieldByName("Patient_name").Addr().Interface(),
  814. reflect.ValueOf(result).Elem().FieldByName("Dialysis_date").Addr().Interface(),
  815. reflect.ValueOf(result).Elem().FieldByName("Dialysis_duration").Addr().Interface(),
  816. reflect.ValueOf(result).Elem().FieldByName("Actual_duration").Addr().Interface(),
  817. reflect.ValueOf(result).Elem().FieldByName("Diff").Addr().Interface(),
  818. reflect.ValueOf(result).Elem().FieldByName("Doctor").Addr().Interface(),
  819. reflect.ValueOf(result).Elem().FieldByName("Nurse").Addr().Interface(),
  820. reflect.ValueOf(result).Elem().FieldByName("Id_card_no").Addr().Interface(),
  821. }
  822. // Scan the row into the struct
  823. if err := rows.Scan(fieldPtrs...); err != nil {
  824. //log.Fatalf("failed to scan row: %v", err)
  825. fmt.Println(err)
  826. }
  827. // Append the result to the slice
  828. results = append(results, result)
  829. }
  830. return results, total, err
  831. }
  832. type QualityControlStandard struct {
  833. ItemName string `json:"item_name"`
  834. ProjectMame string `json:"project_name"`
  835. InspectionMajor int64 `json:"inspection_major"`
  836. InspectionMinor int64 `json:"inspection_minor"`
  837. }
  838. func getQualityControlStandards(org_id int64) ([]QualityControlStandard, error) {
  839. db := XTReadDB()
  840. var count int64
  841. err = db.Model(&models.InspectionReference{}).Where("status = 1 AND org_id = ?", org_id).Count(&count).Error
  842. //count, _ := FindOrgInspectionCount(org_id)
  843. if count == 0 {
  844. var standards []QualityControlStandard
  845. if err := readDb.Model(&models.XtQualityControlStandard{}).Select("re.project_name as project_name,re.item_name as item_name,xt_quality_control_standard.inspection_major as inspection_major,xt_quality_control_standard.inspection_minor as inspection_minor").Joins("join xt_inspection_reference re on re.project_id = xt_quality_control_standard.inspection_major and re.id = xt_quality_control_standard.inspection_minor and re.org_id = 0").Where("xt_quality_control_standard.user_org_id = ? and xt_quality_control_standard.status = 1", org_id).Scan(&standards).Error; err != nil {
  846. return nil, err
  847. }
  848. return standards, nil
  849. } else {
  850. var standards []QualityControlStandard
  851. if err := readDb.Model(&models.XtQualityControlStandard{}).Select("re.project_name as project_name,re.item_name as item_name,xt_quality_control_standard.inspection_major as inspection_major,xt_quality_control_standard.inspection_minor as inspection_minor").Joins("join xt_inspection_reference re on re.project_id = xt_quality_control_standard.inspection_major and re.item_id = xt_quality_control_standard.inspection_minor and re.org_id = ?", org_id).Where("xt_quality_control_standard.user_org_id = ? and xt_quality_control_standard.status = 1", org_id).Scan(&standards).Error; err != nil {
  852. return nil, err
  853. }
  854. return standards, nil
  855. }
  856. }
  857. type DialysisQualityStat struct {
  858. Month string `json:"月"`
  859. Name string `json:"姓名"`
  860. Counts map[string]float64 `json:"counts"`
  861. }
  862. //func GetLatestInspectionValues(org_id int64, yearMonth string) ([]map[string]interface{}, error) {
  863. // standards, err := getQualityControlStandards(org_id)
  864. // if err != nil {
  865. // return nil, err
  866. // }
  867. //
  868. // var selectFields []string
  869. // for _, standard := range standards {
  870. // field := fmt.Sprintf("IFNULL(MAX(CASE WHEN i.item_name = %s THEN i.inspect_value END),'') AS `%s`",
  871. // "'"+standard.ItemName+"'", standard.ItemName)
  872. // selectFields = append(selectFields, field)
  873. // }
  874. //
  875. // query := fmt.Sprintf(`
  876. // SELECT
  877. // p.name as '姓名',
  878. // %s
  879. // FROM xt_inspection i
  880. // JOIN xt_patients p On p.id = i.patient_id
  881. // WHERE DATE_FORMAT(FROM_UNIXTIME(i.inspect_date), '%%Y-%%m') = ? and org_id = ?
  882. //
  883. // GROUP BY i.patient_id
  884. // `, strings.Join(selectFields, ", "))
  885. //
  886. // var results []map[string]interface{}
  887. // rows, err := readDb.Raw(query, yearMonth, org_id).Rows()
  888. // if err != nil {
  889. // return nil, err
  890. // }
  891. // defer rows.Close()
  892. //
  893. // columns, err := rows.Columns()
  894. // if err != nil {
  895. // return nil, err
  896. // }
  897. //
  898. // for rows.Next() {
  899. // // 创建一个长度为列数的切片,用于存储每一行的值
  900. // columnValues := make([]interface{}, len(columns))
  901. // columnPointers := make([]interface{}, len(columns))
  902. // for i := range columnValues {
  903. // columnPointers[i] = &columnValues[i]
  904. // }
  905. //
  906. // // 扫描当前行的值
  907. // if err := rows.Scan(columnPointers...); err != nil {
  908. // return nil, err
  909. // }
  910. //
  911. // // 将扫描到的值放入结果 map 中
  912. // result := make(map[string]interface{})
  913. // for i, colName := range columns {
  914. // val := columnPointers[i].(*interface{})
  915. // result[colName] = *val
  916. // }
  917. //
  918. // results = append(results, result)
  919. // }
  920. //
  921. // return results, nil
  922. //}
  923. func GetLatestInspectionValues(org_id int64, yearMonth string) ([]map[string]interface{}, error) {
  924. standards, err := getQualityControlStandards(org_id)
  925. if err != nil {
  926. return nil, err
  927. }
  928. var selectFields []string
  929. for _, standard := range standards {
  930. field := fmt.Sprintf("IFNULL(MAX(CASE WHEN latest_inspections.item_name = '%s' THEN latest_inspections.inspect_value END),'') AS `%s`",
  931. standard.ItemName, standard.ItemName)
  932. selectFields = append(selectFields, field)
  933. }
  934. query := fmt.Sprintf(`
  935. SELECT
  936. p.name as '姓名',
  937. %s
  938. FROM xt_patients p
  939. JOIN (
  940. SELECT
  941. i1.patient_id,
  942. i1.item_name,
  943. i1.inspect_value
  944. FROM
  945. xt_inspection i1
  946. JOIN (
  947. SELECT
  948. patient_id,
  949. item_name,
  950. MAX(inspect_date) AS latest_inspect_date
  951. FROM
  952. xt_inspection
  953. WHERE
  954. DATE_FORMAT(FROM_UNIXTIME(inspect_date), '%%Y-%%m') = ?
  955. AND org_id = ?
  956. GROUP BY
  957. patient_id, item_name
  958. ) latest
  959. ON
  960. i1.patient_id = latest.patient_id
  961. AND i1.item_name = latest.item_name
  962. AND i1.inspect_date = latest.latest_inspect_date
  963. ) latest_inspections
  964. ON p.id = latest_inspections.patient_id
  965. WHERE p.user_org_id = ? and p.lapseto = 1
  966. GROUP BY p.id, p.name
  967. `, strings.Join(selectFields, ", "))
  968. var results []map[string]interface{}
  969. rows, err := readDb.Raw(query, yearMonth, org_id, org_id).Rows() // 注意这里多传一个org_id参数
  970. if err != nil {
  971. return nil, err
  972. }
  973. defer rows.Close()
  974. columns, err := rows.Columns()
  975. if err != nil {
  976. return nil, err
  977. }
  978. for rows.Next() {
  979. // 创建一个长度为列数的切片,用于存储每一行的值
  980. columnValues := make([]interface{}, len(columns))
  981. columnPointers := make([]interface{}, len(columns))
  982. for i := range columnValues {
  983. columnPointers[i] = &columnValues[i]
  984. }
  985. // 扫描当前行的值
  986. if err := rows.Scan(columnPointers...); err != nil {
  987. return nil, err
  988. }
  989. // 将扫描到的值放入结果 map 中
  990. result := make(map[string]interface{})
  991. for i, colName := range columns {
  992. val := columnPointers[i].(*interface{})
  993. result[colName] = *val
  994. }
  995. results = append(results, result)
  996. }
  997. return results, nil
  998. }
  999. //func GetLatestInspectionValues(org_id int64, yearMonth string) ([]map[string]interface{}, error) {
  1000. // standards, err := getQualityControlStandards(org_id)
  1001. // if err != nil {
  1002. // return nil, err
  1003. // }
  1004. //
  1005. // var selectFields []string
  1006. // for _, standard := range standards {
  1007. // field := fmt.Sprintf("IFNULL(MAX(CASE WHEN latest_inspections.item_name = '%s' THEN latest_inspections.inspect_value END),'') AS `%s`",
  1008. // standard.ItemName, standard.ItemName)
  1009. // selectFields = append(selectFields, field)
  1010. // }
  1011. //
  1012. // query := fmt.Sprintf(`
  1013. // SELECT
  1014. // p.name AS '姓名',
  1015. // %s
  1016. // FROM xt_patients p
  1017. // LEFT JOIN (
  1018. // SELECT
  1019. // i1.patient_id,
  1020. // i1.item_name,
  1021. // i1.inspect_value
  1022. // FROM
  1023. // xt_inspection i1
  1024. // JOIN (
  1025. // SELECT
  1026. // patient_id,
  1027. // item_name,
  1028. // MAX(inspect_date) AS latest_inspect_date
  1029. // FROM
  1030. // xt_inspection
  1031. // WHERE
  1032. // DATE_FORMAT(FROM_UNIXTIME(inspect_date), '%%Y-%%m') = ?
  1033. // AND org_id = ?
  1034. // GROUP BY
  1035. // patient_id, item_name
  1036. // ) latest
  1037. // ON
  1038. // i1.patient_id = latest.patient_id
  1039. // AND i1.item_name = latest.item_name
  1040. // AND i1.inspect_date = latest.latest_inspect_date
  1041. // ) latest_inspections
  1042. // ON p.id = latest_inspections.patient_id
  1043. // WHERE p.user_org_id = ?
  1044. // GROUP BY p.id, p.name
  1045. // `, strings.Join(selectFields, ", "))
  1046. //
  1047. // var results []map[string]interface{}
  1048. // rows, err := readDb.Raw(query, yearMonth, org_id, org_id).Rows() // 注意这里多传一个org_id参数
  1049. // if err != nil {
  1050. // return nil, err
  1051. // }
  1052. // defer rows.Close()
  1053. //
  1054. // columns, err := rows.Columns()
  1055. // if err != nil {
  1056. // return nil, err
  1057. // }
  1058. //
  1059. // for rows.Next() {
  1060. // // 创建一个长度为列数的切片,用于存储每一行的值
  1061. // columnValues := make([]interface{}, len(columns))
  1062. // columnPointers := make([]interface{}, len(columns))
  1063. // for i := range columnValues {
  1064. // columnPointers[i] = &columnValues[i]
  1065. // }
  1066. //
  1067. // // 扫描当前行的值
  1068. // if err := rows.Scan(columnPointers...); err != nil {
  1069. // return nil, err
  1070. // }
  1071. //
  1072. // // 将扫描到的值放入结果 map 中
  1073. // result := make(map[string]interface{})
  1074. // for i, colName := range columns {
  1075. // val := columnPointers[i].(*interface{})
  1076. // result[colName] = *val
  1077. // }
  1078. //
  1079. // results = append(results, result)
  1080. // }
  1081. //
  1082. // return results, nil
  1083. //}
  1084. func createDynamicStruct(fields map[string]interface{}) reflect.Type {
  1085. var structFields []reflect.StructField
  1086. for name, value := range fields {
  1087. structFields = append(structFields, reflect.StructField{
  1088. Name: strings.Title(name),
  1089. Type: reflect.TypeOf(value),
  1090. Tag: reflect.StructTag(fmt.Sprintf(`json:"%s"`, name)),
  1091. })
  1092. }
  1093. return reflect.StructOf(structFields)
  1094. }
  1095. func GetDialysisPrescriptionInfo(start_date string, end_date string, mode int64, org_id int64, page int64, limit int64) (qcp []models.QCPrescription, total int64, err error) {
  1096. offset := (page - 1) * limit
  1097. err = readDb.Model(&models.QCPrescription{}).Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  1098. return readUserDb.Where("status = 1 and org_id=?", org_id)
  1099. }).Preload("QCPatients", "status = 1 and user_org_id = ?", org_id).Preload("QCDialysisOrder", func(db *gorm.DB) *gorm.DB {
  1100. return db.Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  1101. return readUserDb.Where("status = 1 and org_id=?", org_id)
  1102. }).Preload("DeviceNumber", "status = 1 and org_id = ?", org_id).Where("status = 1 AND user_org_id = ?", org_id)
  1103. }).Preload("QCAssessmentAfterDislysis", "status = 1 and user_org_id = ?", org_id).Where("FROM_UNIXTIME(record_date, '%Y-%m-%d') >= ? and FROM_UNIXTIME(record_date, '%Y-%m-%d') <= ? and user_org_id = ? and mode_id = ? and status = 1", start_date, end_date, org_id, mode).Count(&total).Offset(offset).Limit(limit).Find(&qcp).Error
  1104. return
  1105. }
  1106. func GetScheduleInfo(start_date string, end_date string, mode int64, org_id int64, page int64, limit int64) (qcp []models.QCSchedule, total int64, err error) {
  1107. offset := (page - 1) * limit
  1108. err = readDb.Model(&models.QCSchedule{}).Preload("QCPatients", "status = 1 and user_org_id =?", org_id).Preload("QCSPrescription", func(db *gorm.DB) *gorm.DB {
  1109. return db.Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  1110. return readUserDb.Where("status = 1 and org_id=?", org_id)
  1111. }).Where("status = 1 AND user_org_id = ?", org_id)
  1112. }).Preload("QCAssessmentAfterDislysis", "status = 1 and user_org_id = ?", org_id).Preload("QCDialysisOrder", func(db *gorm.DB) *gorm.DB {
  1113. return db.Preload("DeviceNumber", "status = 1").Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  1114. return readUserDb.Where("status = 1 and org_id=?", org_id)
  1115. }).Where("status = 1 AND user_org_id = ?", org_id)
  1116. }).Where("FROM_UNIXTIME(schedule_date, '%Y-%m-%d') >= ? and FROM_UNIXTIME(schedule_date, '%Y-%m-%d') <= ? and user_org_id = ? and mode_id = ? and status = 1", start_date, end_date, org_id, mode).Count(&total).Offset(offset).Limit(limit).Find(&qcp).Error
  1117. return
  1118. }
  1119. type otherItemAmount struct {
  1120. Total int64 `json:"total"`
  1121. Name string `json:"name"`
  1122. Ratio string `json:"ratio"`
  1123. }
  1124. // xt_patients model
  1125. type Patient struct {
  1126. ID uint `gorm:"primaryKey"`
  1127. IDCardNo string `gorm:"column:id_card_no"`
  1128. }
  1129. func (Patient) TableName() string {
  1130. return "xt_patients"
  1131. }
  1132. // xt_assessment_before_dislysis model
  1133. type Assessment struct {
  1134. ID uint `gorm:"id"`
  1135. PatientID uint `gorm:"column:patient_id"`
  1136. SystolicBP float64 `gorm:"column:systolic_blood_pressure"`
  1137. DiastolicBP float64 `gorm:"column:diastolic_blood_pressure"`
  1138. AssessmentDate int64 `gorm:"column:assessment_date"`
  1139. UserOrgID int `gorm:"column:user_org_id"`
  1140. }
  1141. func (Assessment) TableName() string {
  1142. return "xt_assessment_before_dislysis"
  1143. }
  1144. // xt_assessment_before_dislysis model
  1145. type AssessmentAfter struct {
  1146. ID uint `gorm:"id"`
  1147. PatientID uint `gorm:"column:patient_id"`
  1148. SystolicBP float64 `gorm:"column:systolic_blood_pressure"`
  1149. DiastolicBP float64 `gorm:"column:diastolic_blood_pressure"`
  1150. AssessmentDate int64 `gorm:"column:assessment_date"`
  1151. UserOrgID int `gorm:"column:user_org_id"`
  1152. }
  1153. func (AssessmentAfter) TableName() string {
  1154. return "xt_assessment_after_dislysis"
  1155. }
  1156. type WeightDetail struct {
  1157. DialysisNo string
  1158. PatientName string
  1159. Gender int64
  1160. IDCardNo string
  1161. DialysisDate string
  1162. DryWeight float64
  1163. LastWeightAfter float64
  1164. WeightBefore float64
  1165. }
  1166. func GetNewDialysisWeightChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int) (item []*otherItemAmount, err error) {
  1167. //db := XTReadDB()
  1168. var items []*otherItemAmount
  1169. var tempErr error
  1170. var Total int64
  1171. switch statistics_type {
  1172. case 1:
  1173. newItemOne := &otherItemAmount{
  1174. Total: 0,
  1175. Name: "小于40kg",
  1176. Ratio: "0",
  1177. }
  1178. newItemTwo := &otherItemAmount{
  1179. Total: 0,
  1180. Name: "40~50kg",
  1181. Ratio: "0",
  1182. }
  1183. newItemThree := &otherItemAmount{
  1184. Total: 0,
  1185. Name: "50~60kg",
  1186. Ratio: "0",
  1187. }
  1188. newItemfour := &otherItemAmount{
  1189. Total: 0,
  1190. Name: "60~70kg",
  1191. Ratio: "0",
  1192. }
  1193. newItemfive := &otherItemAmount{
  1194. Total: 0,
  1195. Name: "大于70kg",
  1196. Ratio: "0",
  1197. }
  1198. newItemsix := &otherItemAmount{
  1199. Total: 0,
  1200. Name: "未知",
  1201. Ratio: "0",
  1202. }
  1203. data, total, _ := GetNewDialysisWeightDetailTableTenThree(user_org_id, start_time, end_time)
  1204. Total = total
  1205. for _, item := range data {
  1206. fmt.Println(item.DryWeight < 40)
  1207. if item.DryWeight < 40 {
  1208. newItemOne.Total++
  1209. } else if item.DryWeight >= 40 && item.DryWeight < 50 {
  1210. newItemTwo.Total++
  1211. } else if item.DryWeight >= 50 && item.DryWeight < 60 {
  1212. newItemThree.Total++
  1213. } else if item.DryWeight >= 60 && item.DryWeight < 70 {
  1214. newItemfour.Total++
  1215. } else if item.DryWeight >= 70 {
  1216. newItemfive.Total++
  1217. //isHasConditionFour = true
  1218. } else {
  1219. newItemsix.Total++
  1220. }
  1221. }
  1222. items = append(items, newItemOne)
  1223. items = append(items, newItemTwo)
  1224. items = append(items, newItemThree)
  1225. items = append(items, newItemfour)
  1226. items = append(items, newItemfive)
  1227. items = append(items, newItemsix)
  1228. for _, item := range items {
  1229. if math.IsNaN(float64(item.Total) / float64(Total)) {
  1230. item.Ratio = "0.0"
  1231. } else {
  1232. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(Total))*100), 64)
  1233. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  1234. }
  1235. }
  1236. break
  1237. case 2:
  1238. var newTotal int64
  1239. _, totalone, _ := GetNewDialysisWeightDetailTableTenTenOne(user_org_id, start_time, end_time, 1)
  1240. _, totaltwo, _ := GetNewDialysisWeightDetailTableTenTenOne(user_org_id, start_time, end_time, 2)
  1241. _, totalthree, _ := GetNewDialysisWeightDetailTableTenTenOne(user_org_id, start_time, end_time, 3)
  1242. _, totalfour, _ := GetNewDialysisWeightDetailTableTenTenOne(user_org_id, start_time, end_time, 4)
  1243. newTotal = totalone + totaltwo + totalthree + totalfour
  1244. newItem := &otherItemAmount{
  1245. Total: totalone,
  1246. Name: "体重增长<=3%",
  1247. Ratio: "0",
  1248. }
  1249. newItem1 := &otherItemAmount{
  1250. Total: totaltwo,
  1251. Name: "3%<体重增长<5%",
  1252. Ratio: "0",
  1253. }
  1254. newItem2 := &otherItemAmount{
  1255. Total: totalthree,
  1256. Name: "体重增长>=5%",
  1257. Ratio: "0",
  1258. }
  1259. newItem3 := &otherItemAmount{
  1260. Total: totalfour,
  1261. Name: "其他",
  1262. Ratio: "0",
  1263. }
  1264. items = append(items, newItem)
  1265. items = append(items, newItem1)
  1266. items = append(items, newItem2)
  1267. items = append(items, newItem3)
  1268. for _, item := range items {
  1269. if math.IsNaN(float64(item.Total) / float64(newTotal)) {
  1270. item.Ratio = "0.0"
  1271. } else {
  1272. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(newTotal))*100), 64)
  1273. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  1274. }
  1275. }
  1276. break
  1277. case 3:
  1278. var newTotal int64
  1279. _, totalone, _ := GetNewDialysisWeightDetailTableTenTenTwo(user_org_id, start_time, end_time, 1)
  1280. _, totaltwo, _ := GetNewDialysisWeightDetailTableTenTenTwo(user_org_id, start_time, end_time, 2)
  1281. _, totalthree, _ := GetNewDialysisWeightDetailTableTenTenTwo(user_org_id, start_time, end_time, 3)
  1282. _, totalfour, _ := GetNewDialysisWeightDetailTableTenTenTwo(user_org_id, start_time, end_time, 4)
  1283. newTotal = totalone + totaltwo + totalthree + totalfour
  1284. newItem := &otherItemAmount{
  1285. Total: totalone,
  1286. Name: "体重增长<=3%",
  1287. Ratio: "0",
  1288. }
  1289. newItem1 := &otherItemAmount{
  1290. Total: totaltwo,
  1291. Name: "3%<体重增长<5%",
  1292. Ratio: "0",
  1293. }
  1294. newItem2 := &otherItemAmount{
  1295. Total: totalthree,
  1296. Name: "体重增长>=5%",
  1297. Ratio: "0",
  1298. }
  1299. newItem3 := &otherItemAmount{
  1300. Total: totalfour,
  1301. Name: "其他",
  1302. Ratio: "0",
  1303. }
  1304. items = append(items, newItem)
  1305. items = append(items, newItem1)
  1306. items = append(items, newItem2)
  1307. items = append(items, newItem3)
  1308. for _, item := range items {
  1309. if math.IsNaN(float64(item.Total) / float64(newTotal)) {
  1310. item.Ratio = "0.0"
  1311. } else {
  1312. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(newTotal))*100), 64)
  1313. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  1314. }
  1315. }
  1316. break
  1317. case 4:
  1318. var newTotal int64
  1319. var total_one int64
  1320. var total_two int64
  1321. var total_three int64
  1322. data, total, _ := GetNewDialysisWeightDetailTableTenTenOne(user_org_id, start_time, end_time, 0)
  1323. newTotal = total
  1324. for _, item := range data {
  1325. if item.WeightStatus == "达标" {
  1326. total_one++
  1327. } else if item.WeightStatus == "不达标" {
  1328. total_two++
  1329. } else if item.WeightStatus == "其他" {
  1330. total_three++
  1331. }
  1332. }
  1333. newTotal = total_one + total_two + total_three
  1334. newItem := &otherItemAmount{
  1335. Total: total_one,
  1336. Name: "达到干体重",
  1337. Ratio: "0",
  1338. }
  1339. newItem1 := &otherItemAmount{
  1340. Total: total_two,
  1341. Name: "未达到干体重",
  1342. Ratio: "0",
  1343. }
  1344. newItem2 := &otherItemAmount{
  1345. Total: total_three,
  1346. Name: "其他或卧床",
  1347. Ratio: "0",
  1348. }
  1349. items = append(items, newItem)
  1350. items = append(items, newItem1)
  1351. items = append(items, newItem2)
  1352. for _, item := range items {
  1353. if math.IsNaN(float64(item.Total) / float64(newTotal)) {
  1354. item.Ratio = "0.0"
  1355. } else {
  1356. float_value, _ := strconv.ParseFloat(fmt.Sprintf("%.1f", (float64(item.Total)/float64(newTotal))*100), 64)
  1357. item.Ratio = strconv.FormatFloat(float_value, 'f', 1, 32)
  1358. }
  1359. }
  1360. break
  1361. }
  1362. if tempErr != nil {
  1363. return nil, err
  1364. }
  1365. fmt.Println(items)
  1366. return items, nil
  1367. }
  1368. func GetNewDialysisBloodChartData(user_org_id int64, start_time int64, end_time int64, statistics_type int) (item []otherItemAmount, err error) {
  1369. db := XTReadDB()
  1370. switch statistics_type {
  1371. case 1:
  1372. var assessments []Assessment
  1373. err = db.Joins("JOIN xt_patients ON xt_patients.id = xt_assessment_before_dislysis.patient_id").
  1374. Where("xt_assessment_before_dislysis.assessment_date >= ? AND xt_assessment_before_dislysis.assessment_date <= ? AND xt_assessment_before_dislysis.user_org_id = ?", start_time, end_time, user_org_id).
  1375. Find(&assessments).Error
  1376. if err != nil {
  1377. log.Fatal("Query execution error:", err)
  1378. }
  1379. var total, metStandard, unmetStandard int
  1380. // Iterate through the result set
  1381. for _, assessment := range assessments {
  1382. // Fetch patient information
  1383. var patient Patient
  1384. err = db.First(&patient, assessment.PatientID).Error
  1385. if err != nil {
  1386. log.Printf("Skipping record due to missing patient data for ID: %v", assessment.PatientID)
  1387. continue
  1388. }
  1389. // Calculate the patient's age
  1390. age, err := calculateAge(patient.IDCardNo)
  1391. if err != nil {
  1392. log.Printf("Skipping record due to invalid ID card number: %v", patient.IDCardNo)
  1393. continue
  1394. }
  1395. // Update the total count of patients
  1396. total++
  1397. // Determine if the patient meets the standard based on their age and blood pressure
  1398. if (age < 60 && assessment.SystolicBP < 140 && assessment.DiastolicBP < 90) || (age >= 60 && assessment.SystolicBP < 160 && assessment.DiastolicBP < 90) {
  1399. metStandard++
  1400. } else {
  1401. unmetStandard++
  1402. }
  1403. }
  1404. // Calculate and print the results
  1405. if total > 0 {
  1406. metPercentage := float64(metStandard) / float64(total) * 100
  1407. unmetPercentage := float64(unmetStandard) / float64(total) * 100
  1408. fmt.Printf("Total patients: %d\n", total)
  1409. fmt.Printf("Met standard: %d (%.2f%%)\n", metStandard, metPercentage)
  1410. fmt.Printf("Unmet standard: %d (%.2f%%)\n", unmetStandard, unmetPercentage)
  1411. var items otherItemAmount
  1412. items.Name = "达标患者"
  1413. items.Ratio = strconv.FormatFloat(metPercentage, 'f', 1, 32)
  1414. items.Total = int64(metStandard)
  1415. item = append(item, items)
  1416. var items2 otherItemAmount
  1417. items2.Name = "未达标患者"
  1418. items2.Ratio = strconv.FormatFloat(unmetPercentage, 'f', 1, 32)
  1419. items2.Total = int64(unmetStandard)
  1420. item = append(item, items2)
  1421. }
  1422. case 2:
  1423. var assessments []AssessmentAfter
  1424. err = db.Joins("JOIN xt_patients ON xt_patients.id = xt_assessment_after_dislysis.patient_id").
  1425. Where("xt_assessment_after_dislysis.assessment_date >= ? AND xt_assessment_after_dislysis.assessment_date <= ? AND xt_assessment_after_dislysis.user_org_id = ?", start_time, end_time, user_org_id).
  1426. Find(&assessments).Error
  1427. if err != nil {
  1428. log.Fatal("Query execution error:", err)
  1429. }
  1430. var total, metStandard, unmetStandard int
  1431. // Iterate through the result set
  1432. for _, assessment := range assessments {
  1433. // Fetch patient information
  1434. var patient Patient
  1435. err = db.First(&patient, assessment.PatientID).Error
  1436. if err != nil {
  1437. log.Printf("Skipping record due to missing patient data for ID: %v", assessment.PatientID)
  1438. continue
  1439. }
  1440. // Calculate the patient's age
  1441. age, err := calculateAge(patient.IDCardNo)
  1442. if err != nil {
  1443. log.Printf("Skipping record due to invalid ID card number: %v", patient.IDCardNo)
  1444. continue
  1445. }
  1446. // Update the total count of patients
  1447. total++
  1448. // Determine if the patient meets the standard based on their age and blood pressure
  1449. if (age < 60 && assessment.SystolicBP < 140 && assessment.DiastolicBP < 90) || (age >= 60 && assessment.SystolicBP < 160 && assessment.DiastolicBP < 90) {
  1450. metStandard++
  1451. } else {
  1452. unmetStandard++
  1453. }
  1454. }
  1455. // Calculate and print the results
  1456. if total > 0 {
  1457. metPercentage := float64(metStandard) / float64(total) * 100
  1458. unmetPercentage := float64(unmetStandard) / float64(total) * 100
  1459. fmt.Printf("Total patients: %d\n", total)
  1460. fmt.Printf("Met standard: %d (%.2f%%)\n", metStandard, metPercentage)
  1461. fmt.Printf("Unmet standard: %d (%.2f%%)\n", unmetStandard, unmetPercentage)
  1462. var items otherItemAmount
  1463. items.Name = "达标患者"
  1464. items.Ratio = strconv.FormatFloat(metPercentage, 'f', 1, 32)
  1465. items.Total = int64(metStandard)
  1466. item = append(item, items)
  1467. var items2 otherItemAmount
  1468. items2.Name = "未达标患者"
  1469. items2.Ratio = strconv.FormatFloat(unmetPercentage, 'f', 1, 32)
  1470. items2.Total = int64(unmetStandard)
  1471. item = append(item, items2)
  1472. }
  1473. break
  1474. }
  1475. return
  1476. }
  1477. func calculateAge(idCardNo string) (int, error) {
  1478. if len(idCardNo) < 14 {
  1479. return 0, fmt.Errorf("invalid ID card number")
  1480. }
  1481. // Extract birth year, month, and day from ID card number
  1482. year := idCardNo[6:10]
  1483. month := idCardNo[10:12]
  1484. day := idCardNo[12:14]
  1485. // Parse the birth date
  1486. birthDate, err := time.Parse("20060102", year+month+day)
  1487. if err != nil {
  1488. return 0, err
  1489. }
  1490. // Calculate age
  1491. now := time.Now()
  1492. age := now.Year() - birthDate.Year()
  1493. if now.YearDay() < birthDate.YearDay() {
  1494. age--
  1495. }
  1496. return age, nil
  1497. }
  1498. // 定义结果结构体
  1499. type DialysisDataTwo struct {
  1500. DialysisNo string `json:"dialysis_no"`
  1501. PatientName string `json:"patient_name"`
  1502. Gender string `json:"gender"`
  1503. Age int `json:"age"`
  1504. AssessmentDate string `json:"assessment_date"` // 使用 string 存储日期,或使用 time.Time
  1505. DryWeight float64 `json:"dry_weight"`
  1506. WeightBefore float64 `json:"weight_before"`
  1507. WeightAfter float64 `json:"weight_after"`
  1508. LastWeightAfter float64 `json:"last_weight_after"` // 使用指针处理可能为空的值
  1509. WeightAdd float64 `json:"weight_add"` // 使用指针处理可能为空的值
  1510. DryWeightCategory string `json:"dry_weight_category"`
  1511. WeightStatus string `json:"weight_status"`
  1512. }
  1513. // func GetNewDialysisWeightDetailTableTen(user_org_id int64, start_time int64, end_time int64, addType, dryType, afterType, page, limit int64) ([]DialysisDataTwo, int64, error) {
  1514. // offset := (page - 1) * limit
  1515. // var dialysisData []DialysisDataTwo
  1516. // var total int64
  1517. // // 构建基本查询
  1518. // query := readDb.Table("xt_assessment_before_dislysis b").
  1519. // Select(`
  1520. // p.dialysis_no AS dialysis_no,
  1521. // p.name AS patient_name,
  1522. // p.gender AS gender,
  1523. // FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  1524. // b.assessment_date AS assessment_date,
  1525. // b.dry_weight AS dry_weight,
  1526. // b.weight_before AS weight_before,
  1527. // a.weight_after AS weight_after,
  1528. // (
  1529. // SELECT a2.weight_after
  1530. // FROM xt_assessment_after_dislysis a2
  1531. // JOIN xt_assessment_before_dislysis b2
  1532. // ON a2.patient_id = b2.patient_id
  1533. // AND a2.assessment_date = b2.assessment_date
  1534. // WHERE b2.patient_id = b.patient_id
  1535. // AND b2.assessment_date < b.assessment_date
  1536. // ORDER BY b2.assessment_date DESC LIMIT 1
  1537. // ) AS last_weight_after,
  1538. // CASE
  1539. // WHEN (
  1540. // SELECT a2.weight_after
  1541. // FROM xt_assessment_after_dislysis a2
  1542. // JOIN xt_assessment_before_dislysis b2
  1543. // ON a2.patient_id = b2.patient_id
  1544. // AND a2.assessment_date = b2.assessment_date
  1545. // WHERE b2.patient_id = b.patient_id
  1546. // AND b2.assessment_date < b.assessment_date
  1547. // ORDER BY b2.assessment_date DESC LIMIT 1
  1548. // ) IS NOT NULL
  1549. // THEN (b.weight_before - (
  1550. // SELECT a2.weight_after
  1551. // FROM xt_assessment_after_dislysis a2
  1552. // JOIN xt_assessment_before_dislysis b2
  1553. // ON a2.patient_id = b2.patient_id
  1554. // AND a2.assessment_date = b2.assessment_date
  1555. // WHERE b2.patient_id = b.patient_id
  1556. // AND b2.assessment_date < b.assessment_date
  1557. // ORDER BY b2.assessment_date DESC LIMIT 1
  1558. // )) / (
  1559. // SELECT a2.weight_after
  1560. // FROM xt_assessment_after_dislysis a2
  1561. // JOIN xt_assessment_before_dislysis b2
  1562. // ON a2.patient_id = b2.patient_id
  1563. // AND a2.assessment_date = b2.assessment_date
  1564. // WHERE b2.patient_id = b.patient_id
  1565. // AND b2.assessment_date < b.assessment_date
  1566. // ORDER BY b2.assessment_date DESC LIMIT 1
  1567. // )
  1568. // ELSE NULL
  1569. // END AS weight_add,
  1570. // CASE
  1571. // WHEN b.dry_weight IS NOT NULL THEN
  1572. // CASE
  1573. // WHEN b.dry_weight < 40 THEN '小于40'
  1574. // WHEN b.dry_weight BETWEEN 40 AND 50 THEN '40~50'
  1575. // WHEN b.dry_weight BETWEEN 50 AND 60 THEN '50~60'
  1576. // WHEN b.dry_weight BETWEEN 60 AND 70 THEN '60~70'
  1577. // WHEN b.dry_weight > 70 THEN '大于70'
  1578. // END
  1579. // ELSE '其他'
  1580. // END AS dry_weight_category,
  1581. // CASE
  1582. // WHEN b.dry_weight IS NOT NULL THEN
  1583. // CASE
  1584. // WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  1585. // ELSE '不达标'
  1586. // END
  1587. // ELSE '其他'
  1588. // END AS weight_status
  1589. // `).
  1590. // Joins("JOIN xt_patients p ON p.id = b.patient_id").
  1591. // Joins("JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  1592. // Where("b.user_org_id = ?", user_org_id).
  1593. // Where("b.assessment_date >= ?", start_time).
  1594. // Where("b.assessment_date <= ?", end_time).
  1595. // Where("b.status = ?", 1)
  1596. //
  1597. // fmt.Println("dry_type")
  1598. // fmt.Println(dryType)
  1599. // switch dryType {
  1600. // case 1:
  1601. // query.Where("dry_weight_category = '小于40'")
  1602. // case 2:
  1603. // query.Where("dry_weight_category = '40~50'")
  1604. // case 3:
  1605. // query.Where("dry_weight_category = '50~60'")
  1606. // case 4:
  1607. // query.Where("dry_weight_category = '60~70'")
  1608. // case 5:
  1609. // query.Where("dry_weight_category = '大于70'")
  1610. // }
  1611. //
  1612. // // 根据传入的 add_type 值动态构建条件
  1613. // addTypeCondition(query, addType)
  1614. // // 根据传入的 dry_type 值动态构建条件
  1615. // //fmt.Println("dry_type")
  1616. // //fmt.Println(dryType)
  1617. //
  1618. // //dryTypeCondition(query, dryType)
  1619. // // 根据传入的 after_type 值动态构建条件
  1620. // afterTypeCondition(query, afterType)
  1621. // // 获取总记录数
  1622. // if err := query.Count(&total).Error; err != nil {
  1623. // return nil, 0, fmt.Errorf("count query failed: %v", err)
  1624. // }
  1625. // // 获取分页数据
  1626. // rows, err := query.Order("p.id, b.assessment_date").Offset(int(offset)).Limit(int(limit)).Rows()
  1627. // if err != nil {
  1628. // return nil, 0, fmt.Errorf("pagination query failed: %v", err)
  1629. // }
  1630. // defer rows.Close()
  1631. // // 处理结果集
  1632. // for rows.Next() {
  1633. // var data DialysisDataTwo
  1634. // if err := rows.Scan(
  1635. // &data.DialysisNo,
  1636. // &data.PatientName,
  1637. // &data.Gender,
  1638. // &data.Age,
  1639. // &data.AssessmentDate,
  1640. // &data.DryWeight,
  1641. // &data.WeightBefore,
  1642. // &data.WeightAfter,
  1643. // &data.LastWeightAfter,
  1644. // &data.WeightAdd,
  1645. // &data.DryWeightCategory,
  1646. // &data.WeightStatus,
  1647. // ); err != nil {
  1648. // return nil, 0, fmt.Errorf("row scan failed: %v", err)
  1649. // }
  1650. // // 将每一行结果追加到切片中
  1651. // dialysisData = append(dialysisData, data)
  1652. // }
  1653. // return dialysisData, total, nil
  1654. // }
  1655. func GetNewDialysisWeightDetailTableTenFour(
  1656. user_org_id int64,
  1657. start_time int64,
  1658. end_time int64,
  1659. addType, dryType, afterType, page, limit int64,
  1660. ) ([]DialysisDataTwo, int64, error) {
  1661. offset := (page - 1) * limit
  1662. var total int64
  1663. // 构建基本查询
  1664. query := readDb.Table("xt_assessment_before_dislysis b").
  1665. Select(`
  1666. p.dialysis_no AS dialysis_no,
  1667. p.name AS patient_name,
  1668. p.gender AS gender,
  1669. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  1670. b.assessment_date AS assessment_date,
  1671. b.dry_weight AS dry_weight,
  1672. b.weight_before AS weight_before,
  1673. a.weight_after AS weight_after,
  1674. (
  1675. SELECT a2.weight_after
  1676. FROM xt_assessment_after_dislysis a2
  1677. JOIN xt_assessment_before_dislysis b2
  1678. ON a2.patient_id = b2.patient_id
  1679. AND a2.assessment_date = b2.assessment_date
  1680. WHERE b2.patient_id = b.patient_id
  1681. AND b2.assessment_date < b.assessment_date
  1682. ORDER BY b2.assessment_date DESC LIMIT 1
  1683. ) AS last_weight_after,
  1684. CASE
  1685. WHEN (
  1686. SELECT a2.weight_after
  1687. FROM xt_assessment_after_dislysis a2
  1688. JOIN xt_assessment_before_dislysis b2
  1689. ON a2.patient_id = b2.patient_id
  1690. AND a2.assessment_date = b2.assessment_date
  1691. WHERE b2.patient_id = b.patient_id
  1692. AND b2.assessment_date < b.assessment_date
  1693. ORDER BY b2.assessment_date DESC LIMIT 1
  1694. ) IS NOT NULL
  1695. THEN (b.weight_before - (
  1696. SELECT a2.weight_after
  1697. FROM xt_assessment_after_dislysis a2
  1698. JOIN xt_assessment_before_dislysis b2
  1699. ON a2.patient_id = b2.patient_id
  1700. AND a2.assessment_date = b2.assessment_date
  1701. WHERE b2.patient_id = b.patient_id
  1702. AND b2.assessment_date < b.assessment_date
  1703. ORDER BY b2.assessment_date DESC LIMIT 1
  1704. )) / (
  1705. SELECT a2.weight_after
  1706. FROM xt_assessment_after_dislysis a2
  1707. JOIN xt_assessment_before_dislysis b2
  1708. ON a2.patient_id = b2.patient_id
  1709. AND a2.assessment_date = b2.assessment_date
  1710. WHERE b2.patient_id = b.patient_id
  1711. AND b2.assessment_date < b.assessment_date
  1712. ORDER BY b2.assessment_date DESC LIMIT 1
  1713. )
  1714. ELSE NULL
  1715. END AS weight_add,
  1716. CASE
  1717. WHEN b.dry_weight IS NOT NULL THEN
  1718. CASE
  1719. WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  1720. ELSE '不达标'
  1721. END
  1722. ELSE '其他'
  1723. END AS weight_status
  1724. `).
  1725. Joins("left JOIN xt_patients p ON p.id = b.patient_id").
  1726. Joins("left JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  1727. Where("b.user_org_id = ?", user_org_id).
  1728. Where("b.assessment_date >= ?", start_time).
  1729. Where("b.assessment_date <= ?", end_time).
  1730. Where("b.status = ?", 1)
  1731. // 处理干重过滤
  1732. switch dryType {
  1733. case 5:
  1734. query = query.Where("b.dry_weight < ?", 40)
  1735. case 1:
  1736. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 40, 50)
  1737. case 2:
  1738. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 50, 60)
  1739. case 3:
  1740. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 60, 70)
  1741. case 4:
  1742. query = query.Where("b.dry_weight >= ?", 70)
  1743. case 6:
  1744. query = query.Where("b.dry_weight IS NULL OR b.dry_weight = ''")
  1745. }
  1746. // 处理加重过滤
  1747. switch addType {
  1748. case 1:
  1749. query = query.Where("weight_add <= 0.03")
  1750. case 2:
  1751. query = query.Where("weight_add > 0.03 AND weight_add < 0.05")
  1752. case 3:
  1753. query = query.Where("weight_add >= 0.05")
  1754. case 4:
  1755. query = query.Where("weight_add IS NULL")
  1756. }
  1757. // 处理状态过滤
  1758. switch afterType {
  1759. case 1:
  1760. query = query.Having("CASE WHEN b.dry_weight IS NOT NULL THEN CASE WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END ELSE '其他' END = ?", "达标")
  1761. case 2:
  1762. query = query.Having("CASE WHEN b.dry_weight IS NOT NULL THEN CASE WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END ELSE '其他' END = ?", "不达标")
  1763. case 3:
  1764. query = query.Having("CASE WHEN b.dry_weight IS NOT NULL THEN CASE WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END ELSE '其他' END = ?", "其他")
  1765. }
  1766. // 获取总记录数
  1767. if err := query.Count(&total).Error; err != nil {
  1768. return nil, 0, fmt.Errorf("count query failed: %v", err)
  1769. }
  1770. var data []DialysisDataTwo
  1771. query.Order("p.id, b.assessment_date").Offset(int(offset)).Limit(int(limit)).Find(&data)
  1772. fmt.Println(data)
  1773. return data, total, nil
  1774. }
  1775. // func GetNewDialysisWeightDetailTableTen(
  1776. //
  1777. // user_org_id int64,
  1778. // start_time int64,
  1779. // end_time int64,
  1780. // addType, dryType, afterType, page, limit int64, keyword string) ([]DialysisDataTwo, int64, error) {
  1781. // offset := (page - 1) * limit
  1782. // //var dialysisData []DialysisDataTwo
  1783. // var total int64
  1784. // keyword = "%" + keyword + "%"
  1785. // // 构建基本查询
  1786. // query := readDb.Table("xt_assessment_before_dislysis b").
  1787. // Select(`
  1788. // p.dialysis_no AS dialysis_no,
  1789. // p.name AS patient_name,
  1790. // p.gender AS gender,
  1791. // FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  1792. // b.assessment_date AS assessment_date,
  1793. // latest_dry_weight.dry_weight AS dry_weight,
  1794. // b.dry_weight AS dry_weight,
  1795. // b.weight_before AS weight_before,
  1796. // a.weight_after AS weight_after,
  1797. // (
  1798. // SELECT a2.weight_after
  1799. // FROM xt_assessment_after_dislysis a2
  1800. // JOIN xt_assessment_before_dislysis b2
  1801. // ON a2.patient_id = b2.patient_id
  1802. // AND a2.assessment_date = b2.assessment_date
  1803. // WHERE b2.patient_id = b.patient_id
  1804. // AND b2.assessment_date < b.assessment_date
  1805. // ORDER BY b2.assessment_date DESC LIMIT 1
  1806. // ) AS last_weight_after,
  1807. // CASE
  1808. // WHEN (
  1809. // SELECT a2.weight_after
  1810. // FROM xt_assessment_after_dislysis a2
  1811. // JOIN xt_assessment_before_dislysis b2
  1812. // ON a2.patient_id = b2.patient_id
  1813. // AND a2.assessment_date = b2.assessment_date
  1814. // WHERE b2.patient_id = b.patient_id
  1815. // AND b2.assessment_date < b.assessment_date
  1816. // ORDER BY b2.assessment_date DESC LIMIT 1
  1817. // ) IS NOT NULL
  1818. // THEN (b.weight_before - (
  1819. // SELECT a2.weight_after
  1820. // FROM xt_assessment_after_dislysis a2
  1821. // JOIN xt_assessment_before_dislysis b2
  1822. // ON a2.patient_id = b2.patient_id
  1823. // AND a2.assessment_date = b2.assessment_date
  1824. // WHERE b2.patient_id = b.patient_id
  1825. // AND b2.assessment_date < b.assessment_date
  1826. // ORDER BY b2.assessment_date DESC LIMIT 1
  1827. // )) / (
  1828. // SELECT a2.weight_after
  1829. // FROM xt_assessment_after_dislysis a2
  1830. // JOIN xt_assessment_before_dislysis b2
  1831. // ON a2.patient_id = b2.patient_id
  1832. // AND a2.assessment_date = b2.assessment_date
  1833. // WHERE b2.patient_id = b.patient_id
  1834. // AND b2.assessment_date < b.assessment_date
  1835. // ORDER BY b2.assessment_date DESC LIMIT 1
  1836. // )
  1837. // ELSE NULL
  1838. // END AS weight_add,
  1839. // CASE
  1840. // WHEN a.weight_after IS NULL THEN '其他'
  1841. // WHEN b.dry_weight IS NOT NULL THEN
  1842. // CASE
  1843. // WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  1844. // ELSE '不达标'
  1845. // END
  1846. // ELSE '其他'
  1847. // END AS weight_status
  1848. // `).
  1849. // Joins("JOIN xt_patients p ON p.id = b.patient_id and p.name like ?", keyword).
  1850. // Joins("left JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  1851. // Where("b.user_org_id = ?", user_org_id).
  1852. // Where("b.assessment_date >= ?", start_time).
  1853. // Where("b.assessment_date <= ?", end_time).
  1854. // Where("b.status = ?", 1)
  1855. //
  1856. // switch dryType {
  1857. // case 5:
  1858. // query = query.Where("b.dry_weight < ?", 40)
  1859. // case 1:
  1860. // query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 40, 50)
  1861. // case 2:
  1862. // query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 50, 60)
  1863. // case 3:
  1864. // query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 60, 70)
  1865. // case 4:
  1866. // query = query.Where("b.dry_weight >= ?", 70)
  1867. // case 6:
  1868. // query = query.Where("b.dry_weight IS NULL OR b.dry_weight = ''")
  1869. // }
  1870. //
  1871. // switch addType {
  1872. // case 1:
  1873. // query = query.Where(`
  1874. // (
  1875. // CASE
  1876. // WHEN (
  1877. // SELECT a2.weight_after
  1878. // FROM xt_assessment_after_dislysis a2
  1879. // JOIN xt_assessment_before_dislysis b2
  1880. // ON a2.patient_id = b2.patient_id
  1881. // AND a2.assessment_date = b2.assessment_date
  1882. // WHERE b2.patient_id = b.patient_id
  1883. // AND b2.assessment_date < b.assessment_date
  1884. // ORDER BY b2.assessment_date DESC LIMIT 1
  1885. // ) IS NOT NULL
  1886. // THEN (b.weight_before - (
  1887. // SELECT a2.weight_after
  1888. // FROM xt_assessment_after_dislysis a2
  1889. // JOIN xt_assessment_before_dislysis b2
  1890. // ON a2.patient_id = b2.patient_id
  1891. // AND a2.assessment_date = b2.assessment_date
  1892. // WHERE b2.patient_id = b.patient_id
  1893. // AND b2.assessment_date < b.assessment_date
  1894. // ORDER BY b2.assessment_date DESC LIMIT 1
  1895. // )) / (
  1896. // SELECT a2.weight_after
  1897. // FROM xt_assessment_after_dislysis a2
  1898. // JOIN xt_assessment_before_dislysis b2
  1899. // ON a2.patient_id = b2.patient_id
  1900. // AND a2.assessment_date = b2.assessment_date
  1901. // WHERE b2.patient_id = b.patient_id
  1902. // AND b2.assessment_date < b.assessment_date
  1903. // ORDER BY b2.assessment_date DESC LIMIT 1
  1904. // )
  1905. // ELSE NULL
  1906. // END
  1907. // ) <= 0.03
  1908. // `)
  1909. // case 2:
  1910. // query = query.Where(`
  1911. // (
  1912. // CASE
  1913. // WHEN (
  1914. // SELECT a2.weight_after
  1915. // FROM xt_assessment_after_dislysis a2
  1916. // JOIN xt_assessment_before_dislysis b2
  1917. // ON a2.patient_id = b2.patient_id
  1918. // AND a2.assessment_date = b2.assessment_date
  1919. // WHERE b2.patient_id = b.patient_id
  1920. // AND b2.assessment_date < b.assessment_date
  1921. // ORDER BY b2.assessment_date DESC LIMIT 1
  1922. // ) IS NOT NULL
  1923. // THEN (b.weight_before - (
  1924. // SELECT a2.weight_after
  1925. // FROM xt_assessment_after_dislysis a2
  1926. // JOIN xt_assessment_before_dislysis b2
  1927. // ON a2.patient_id = b2.patient_id
  1928. // AND a2.assessment_date = b2.assessment_date
  1929. // WHERE b2.patient_id = b.patient_id
  1930. // AND b2.assessment_date < b.assessment_date
  1931. // ORDER BY b2.assessment_date DESC LIMIT 1
  1932. // )) / (
  1933. // SELECT a2.weight_after
  1934. // FROM xt_assessment_after_dislysis a2
  1935. // JOIN xt_assessment_before_dislysis b2
  1936. // ON a2.patient_id = b2.patient_id
  1937. // AND a2.assessment_date = b2.assessment_date
  1938. // WHERE b2.patient_id = b.patient_id
  1939. // AND b2.assessment_date < b.assessment_date
  1940. // ORDER BY b2.assessment_date DESC LIMIT 1
  1941. // )
  1942. // ELSE NULL
  1943. // END
  1944. // ) > 0.03 AND (
  1945. // CASE
  1946. // WHEN (
  1947. // SELECT a2.weight_after
  1948. // FROM xt_assessment_after_dislysis a2
  1949. // JOIN xt_assessment_before_dislysis b2
  1950. // ON a2.patient_id = b2.patient_id
  1951. // AND a2.assessment_date = b2.assessment_date
  1952. // WHERE b2.patient_id = b.patient_id
  1953. // AND b2.assessment_date < b.assessment_date
  1954. // ORDER BY b2.assessment_date DESC LIMIT 1
  1955. // ) IS NOT NULL
  1956. // THEN (b.weight_before - (
  1957. // SELECT a2.weight_after
  1958. // FROM xt_assessment_after_dislysis a2
  1959. // JOIN xt_assessment_before_dislysis b2
  1960. // ON a2.patient_id = b2.patient_id
  1961. // AND a2.assessment_date = b2.assessment_date
  1962. // WHERE b2.patient_id = b.patient_id
  1963. // AND b2.assessment_date < b.assessment_date
  1964. // ORDER BY b2.assessment_date DESC LIMIT 1
  1965. // )) / (
  1966. // SELECT a2.weight_after
  1967. // FROM xt_assessment_after_dislysis a2
  1968. // JOIN xt_assessment_before_dislysis b2
  1969. // ON a2.patient_id = b2.patient_id
  1970. // AND a2.assessment_date = b2.assessment_date
  1971. // WHERE b2.patient_id = b.patient_id
  1972. // AND b2.assessment_date < b.assessment_date
  1973. // ORDER BY b2.assessment_date DESC LIMIT 1
  1974. // )
  1975. // ELSE NULL
  1976. // END
  1977. // ) < 0.05
  1978. // `)
  1979. // case 3:
  1980. // query = query.Where(`
  1981. // (
  1982. // CASE
  1983. // WHEN (
  1984. // SELECT a2.weight_after
  1985. // FROM xt_assessment_after_dislysis a2
  1986. // JOIN xt_assessment_before_dislysis b2
  1987. // ON a2.patient_id = b2.patient_id
  1988. // AND a2.assessment_date = b2.assessment_date
  1989. // WHERE b2.patient_id = b.patient_id
  1990. // AND b2.assessment_date < b.assessment_date
  1991. // ORDER BY b2.assessment_date DESC LIMIT 1
  1992. // ) IS NOT NULL
  1993. // THEN (b.weight_before - (
  1994. // SELECT a2.weight_after
  1995. // FROM xt_assessment_after_dislysis a2
  1996. // JOIN xt_assessment_before_dislysis b2
  1997. // ON a2.patient_id = b2.patient_id
  1998. // AND a2.assessment_date = b2.assessment_date
  1999. // WHERE b2.patient_id = b.patient_id
  2000. // AND b2.assessment_date < b.assessment_date
  2001. // ORDER BY b2.assessment_date DESC LIMIT 1
  2002. // )) / (
  2003. // SELECT a2.weight_after
  2004. // FROM xt_assessment_after_dislysis a2
  2005. // JOIN xt_assessment_before_dislysis b2
  2006. // ON a2.patient_id = b2.patient_id
  2007. // AND a2.assessment_date = b2.assessment_date
  2008. // WHERE b2.patient_id = b.patient_id
  2009. // AND b2.assessment_date < b.assessment_date
  2010. // ORDER BY b2.assessment_date DESC LIMIT 1
  2011. // )
  2012. // ELSE NULL
  2013. // END
  2014. // ) >= 0.05
  2015. // `)
  2016. // case 4:
  2017. // query = query.Where(`
  2018. // (
  2019. // SELECT a2.weight_after
  2020. // FROM xt_assessment_after_dislysis a2
  2021. // JOIN xt_assessment_before_dislysis b2
  2022. // ON a2.patient_id = b2.patient_id
  2023. // AND a2.assessment_date = b2.assessment_date
  2024. // WHERE b2.patient_id = b.patient_id
  2025. // AND b2.assessment_date < b.assessment_date
  2026. // ORDER BY b2.assessment_date DESC LIMIT 1
  2027. // ) IS NULL
  2028. // `)
  2029. // }
  2030. //
  2031. // switch afterType {
  2032. // case 1:
  2033. // query = query.Where(`
  2034. // CASE
  2035. // WHEN a.weight_after IS NULL THEN '其他'
  2036. // WHEN b.dry_weight IS NOT NULL THEN
  2037. // CASE
  2038. // WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  2039. // ELSE '不达标'
  2040. // END
  2041. // ELSE '其他'
  2042. // END = ?`, "达标")
  2043. // case 2:
  2044. // query = query.Where(`
  2045. // CASE
  2046. // WHEN a.weight_after IS NULL THEN '其他'
  2047. // WHEN b.dry_weight IS NOT NULL THEN
  2048. // CASE
  2049. // WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  2050. // ELSE '不达标'
  2051. // END
  2052. // ELSE '其他'
  2053. // END = ?`, "不达标")
  2054. // case 3:
  2055. // query = query.Where(`
  2056. // CASE
  2057. // WHEN a.weight_after IS NULL THEN '其他'
  2058. // WHEN b.dry_weight IS NOT NULL THEN
  2059. // CASE
  2060. // WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  2061. // ELSE '不达标'
  2062. // END
  2063. // ELSE '其他'
  2064. // END = ?`, "其他")
  2065. // }
  2066. //
  2067. // //// 获取总记录数
  2068. // if err := query.Count(&total).Error; err != nil {
  2069. // return nil, 0, fmt.Errorf("count query failed: %v", err)
  2070. // }
  2071. //
  2072. // var data []DialysisDataTwo
  2073. //
  2074. // query.Order("p.id, b.assessment_date").Offset(int(offset)).Limit(int(limit)).Find(&data)
  2075. //
  2076. // return data, total, nil
  2077. // }
  2078. //func GetNewDialysisWeightDetailTableTenTenOne(
  2079. // user_org_id int64,
  2080. // start_time int64,
  2081. // end_time int64,
  2082. //
  2083. //) ([]DialysisDataTwo, int64, error) {
  2084. //
  2085. // // Build base query
  2086. // query := readDb.Table("xt_assessment_before_dislysis b").
  2087. // Select(`
  2088. // p.dialysis_no AS dialysis_no,
  2089. // p.name AS patient_name,
  2090. // p.gender AS gender,
  2091. // FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2092. // b.assessment_date AS assessment_date,
  2093. // b.dry_weight AS dry_weight,
  2094. // b.weight_before AS weight_before,
  2095. // a.weight_after AS weight_after,
  2096. // (
  2097. // SELECT a2.weight_after
  2098. // FROM xt_assessment_after_dislysis a2
  2099. // WHERE a2.patient_id = b.patient_id
  2100. // AND a2.assessment_date < b.assessment_date
  2101. // ORDER BY a2.assessment_date DESC LIMIT 1
  2102. // ) AS last_weight_after,
  2103. // CASE
  2104. // WHEN (
  2105. // SELECT a2.weight_after
  2106. // FROM xt_assessment_after_dislysis a2
  2107. // WHERE a2.patient_id = b.patient_id
  2108. // AND a2.assessment_date < b.assessment_date
  2109. // ORDER BY a2.assessment_date DESC LIMIT 1
  2110. // ) IS NOT NULL
  2111. // THEN (b.weight_before - (
  2112. // SELECT a2.weight_after
  2113. // FROM xt_assessment_after_dislysis a2
  2114. // WHERE a2.patient_id = b.patient_id
  2115. // AND a2.assessment_date < b.assessment_date
  2116. // ORDER BY a2.assessment_date DESC LIMIT 1
  2117. // )) / (
  2118. // SELECT a2.weight_after
  2119. // FROM xt_assessment_after_dislysis a2
  2120. // WHERE a2.patient_id = b.patient_id
  2121. // AND a2.assessment_date < b.assessment_date
  2122. // ORDER BY a2.assessment_date DESC LIMIT 1
  2123. // )
  2124. // ELSE NULL
  2125. // END AS weight_add,
  2126. // CASE
  2127. // WHEN a.weight_after IS NULL OR a.weight_after = 0 THEN '其他'
  2128. // WHEN latest_dry_weight.dry_weight IS NOT NULL THEN
  2129. // CASE
  2130. // WHEN ABS(a.weight_after - latest_dry_weight.dry_weight) <= 0.3 THEN '达标'
  2131. // ELSE '不达标'
  2132. // END
  2133. // ELSE '其他'
  2134. // END AS weight_status
  2135. // `).
  2136. // Joins("JOIN xt_patients p ON p.id = b.patient_id ").
  2137. // Joins("LEFT JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  2138. // Where("b.user_org_id = ?", user_org_id).
  2139. // Where("b.assessment_date BETWEEN ? AND ?", start_time, end_time).
  2140. // Where("b.assessment_date = latest_dry_weight.max_assessment_date").
  2141. // Where("b.status = ?", 1)
  2142. //
  2143. // // Apply filters for dryType
  2144. //
  2145. // // Apply filters for addType
  2146. //
  2147. // // Apply filters for afterType
  2148. // var total int64
  2149. //
  2150. // // Count total records
  2151. // if err := query.Count(&total).Error; err != nil {
  2152. // return nil, 0, fmt.Errorf("count query failed: %v", err)
  2153. // }
  2154. //
  2155. // // Fetch data with pagination
  2156. // var data []DialysisDataTwo
  2157. // if err := query.Order("p.id, b.assessment_date").Find(&data).Error; err != nil {
  2158. // return nil, 0, fmt.Errorf("data query failed: %v", err)
  2159. // }
  2160. //
  2161. // return data, total, nil
  2162. //}
  2163. // func GetNewDialysisWeightDetailTableTenTenOne(
  2164. //
  2165. // user_org_id int64,
  2166. // start_time int64,
  2167. // end_time int64,
  2168. // addType, dryType, afterType, page, limit int64, keyword string,
  2169. //
  2170. // ) ([]DialysisDataTwo, int64, error) {
  2171. // offset := (page - 1) * limit
  2172. // var total int64
  2173. // keyword = "%" + keyword + "%"
  2174. //
  2175. // // Build base query
  2176. // query := readDb.Table("xt_assessment_before_dislysis b").
  2177. // Select(`
  2178. // p.dialysis_no AS dialysis_no,
  2179. // p.name AS patient_name,
  2180. // p.gender AS gender,
  2181. // FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2182. // b.assessment_date AS assessment_date,
  2183. // latest_dry_weight.dry_weight AS dry_weight,
  2184. // b.weight_before AS weight_before,
  2185. // a.weight_after AS weight_after,
  2186. // (
  2187. // SELECT a2.weight_after
  2188. // FROM xt_assessment_after_dislysis a2
  2189. // WHERE a2.patient_id = b.patient_id
  2190. // AND a2.assessment_date < b.assessment_date
  2191. // ORDER BY a2.assessment_date DESC LIMIT 1
  2192. // ) AS last_weight_after,
  2193. // CASE
  2194. // WHEN (
  2195. // SELECT a2.weight_after
  2196. // FROM xt_assessment_after_dislysis a2
  2197. // WHERE a2.patient_id = b.patient_id
  2198. // AND a2.assessment_date < b.assessment_date
  2199. // ORDER BY a2.assessment_date DESC LIMIT 1
  2200. // ) IS NOT NULL
  2201. // THEN (b.weight_before - (
  2202. // SELECT a2.weight_after
  2203. // FROM xt_assessment_after_dislysis a2
  2204. // WHERE a2.patient_id = b.patient_id
  2205. // AND a2.assessment_date < b.assessment_date
  2206. // ORDER BY a2.assessment_date DESC LIMIT 1
  2207. // )) / (
  2208. // SELECT a2.weight_after
  2209. // FROM xt_assessment_after_dislysis a2
  2210. // WHERE a2.patient_id = b.patient_id
  2211. // AND a2.assessment_date < b.assessment_date
  2212. // ORDER BY a2.assessment_date DESC LIMIT 1
  2213. // )
  2214. // ELSE NULL
  2215. // END AS weight_add,
  2216. // CASE
  2217. // WHEN a.weight_after IS NULL THEN '其他'
  2218. // WHEN latest_dry_weight.dry_weight IS NOT NULL THEN
  2219. // CASE
  2220. // WHEN ABS(a.weight_after - latest_dry_weight.dry_weight) <= 0.3 THEN '达标'
  2221. // ELSE '不达标'
  2222. // END
  2223. // ELSE '其他'
  2224. // END AS weight_status
  2225. // `).
  2226. // Joins("JOIN xt_patients p ON p.id = b.patient_id AND p.name LIKE ?", keyword).
  2227. // Joins("LEFT JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  2228. // Joins("JOIN (SELECT b2.patient_id, MAX(b2.assessment_date) AS max_assessment_date, MAX(b2.dry_weight) AS dry_weight FROM xt_assessment_before_dislysis b2 WHERE b2.user_org_id = ? AND b2.assessment_date BETWEEN ? AND ? GROUP BY b2.patient_id) latest_dry_weight ON latest_dry_weight.patient_id = b.patient_id", user_org_id, start_time, end_time).
  2229. // Where("b.user_org_id = ?", user_org_id).
  2230. // Where("b.assessment_date BETWEEN ? AND ?", start_time, end_time).
  2231. // Where("b.assessment_date = latest_dry_weight.max_assessment_date").
  2232. // Where("b.status = ?", 1)
  2233. //
  2234. // // Apply filters for dryType
  2235. // switch dryType {
  2236. // case 5:
  2237. // query = query.Where("b.dry_weight < ?", 40)
  2238. // case 1:
  2239. // query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 40, 50)
  2240. // case 2:
  2241. // query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 50, 60)
  2242. // case 3:
  2243. // query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 60, 70)
  2244. // case 4:
  2245. // query = query.Where("b.dry_weight >= ?", 70)
  2246. // case 6:
  2247. // query = query.Where("b.dry_weight IS NULL OR b.dry_weight = ''")
  2248. // }
  2249. //
  2250. // // Apply filters for addType
  2251. // switch addType {
  2252. // case 1:
  2253. // query = query.Where("(b.weight_before - last_weight_after) / last_weight_after <= 0.03")
  2254. // case 2:
  2255. // query = query.Where("(b.weight_before - last_weight_after) / last_weight_after > 0.03 AND (b.weight_before - last_weight_after) / last_weight_after < 0.05")
  2256. // case 3:
  2257. // query = query.Where("(b.weight_before - last_weight_after) / last_weight_after >= 0.05")
  2258. // case 4:
  2259. // query = query.Where("last_weight_after IS NULL")
  2260. // }
  2261. //
  2262. // // Apply filters for afterType
  2263. // switch afterType {
  2264. // case 1:
  2265. // query = query.Where("CASE WHEN a.weight_after IS NULL THEN '其他' WHEN latest_dry_weight.dry_weight IS NOT NULL AND ABS(a.weight_after - latest_dry_weight.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END = ?", "达标")
  2266. // case 2:
  2267. // query = query.Where("CASE WHEN a.weight_after IS NULL THEN '其他' WHEN latest_dry_weight.dry_weight IS NOT NULL AND ABS(a.weight_after - latest_dry_weight.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END = ?", "不达标")
  2268. // case 3:
  2269. // query = query.Where("CASE WHEN a.weight_after IS NULL THEN '其他' WHEN latest_dry_weight.dry_weight IS NOT NULL AND ABS(a.weight_after - latest_dry_weight.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END = ?", "其他")
  2270. // }
  2271. //
  2272. // // Count total records
  2273. // if err := query.Count(&total).Error; err != nil {
  2274. // return nil, 0, fmt.Errorf("count query failed: %v", err)
  2275. // }
  2276. //
  2277. // // Fetch data with pagination
  2278. // var data []DialysisDataTwo
  2279. // if err := query.Order("p.id, b.assessment_date").Offset(int(offset)).Limit(int(limit)).Find(&data).Error; err != nil {
  2280. // return nil, 0, fmt.Errorf("data query failed: %v", err)
  2281. // }
  2282. //
  2283. // return data, total, nil
  2284. // }
  2285. func GetNewDialysisWeightDetailTableTen(
  2286. user_org_id int64,
  2287. start_time int64,
  2288. end_time int64,
  2289. addType, dryType, afterType, page, limit int64, keyword string,
  2290. ) ([]DialysisDataTwo, int64, error) {
  2291. offset := (page - 1) * limit
  2292. var total int64
  2293. keyword = "%" + keyword + "%"
  2294. // Build base query
  2295. query := readDb.Table("xt_assessment_before_dislysis b").
  2296. Select(`
  2297. p.dialysis_no AS dialysis_no,
  2298. p.name AS patient_name,
  2299. p.gender AS gender,
  2300. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2301. b.assessment_date AS assessment_date,
  2302. latest_dry_weight.dry_weight AS dry_weight,
  2303. b.weight_before AS weight_before,
  2304. a.weight_after AS weight_after,
  2305. (
  2306. SELECT a2.weight_after
  2307. FROM xt_assessment_after_dislysis a2
  2308. WHERE a2.patient_id = b.patient_id
  2309. AND a2.assessment_date < b.assessment_date
  2310. ORDER BY a2.assessment_date DESC LIMIT 1
  2311. ) AS last_weight_after
  2312. `).
  2313. Joins("JOIN xt_patients p ON p.id = b.patient_id AND p.name LIKE ?", keyword).
  2314. Joins("LEFT JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  2315. Joins("JOIN (SELECT b2.patient_id, MAX(b2.assessment_date) AS max_assessment_date, MAX(b2.dry_weight) AS dry_weight FROM xt_assessment_before_dislysis b2 WHERE b2.user_org_id = ? AND b2.assessment_date BETWEEN ? AND ? GROUP BY b2.patient_id) latest_dry_weight ON latest_dry_weight.patient_id = b.patient_id", user_org_id, start_time, end_time).
  2316. Where("b.user_org_id = ?", user_org_id).
  2317. Where("b.assessment_date BETWEEN ? AND ?", start_time, end_time).
  2318. Where("b.assessment_date = latest_dry_weight.max_assessment_date").
  2319. Where("b.status = ?", 1)
  2320. // Apply filters for dryType
  2321. switch dryType {
  2322. case 5:
  2323. query = query.Where("b.dry_weight < ?", 40)
  2324. case 1:
  2325. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 40, 50)
  2326. case 2:
  2327. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 50, 60)
  2328. case 3:
  2329. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 60, 70)
  2330. case 4:
  2331. query = query.Where("b.dry_weight >= ?", 70)
  2332. case 6:
  2333. query = query.Where("b.dry_weight IS NULL OR b.dry_weight = ''")
  2334. }
  2335. // Calculate last_weight_after as a subquery in the HAVING clause
  2336. query = query.Having("last_weight_after IS NOT NULL")
  2337. // Apply filters for addType
  2338. switch addType {
  2339. case 1:
  2340. query = query.Having("(b.weight_before - last_weight_after) / last_weight_after <= 0.03")
  2341. case 2:
  2342. query = query.Having("(b.weight_before - last_weight_after) / last_weight_after > 0.03 AND (b.weight_before - last_weight_after) / last_weight_after < 0.05")
  2343. case 3:
  2344. query = query.Having("(b.weight_before - last_weight_after) / last_weight_after >= 0.05")
  2345. case 4:
  2346. query = query.Having("last_weight_after IS NULL")
  2347. }
  2348. // Apply filters for afterType
  2349. switch afterType {
  2350. case 1:
  2351. query = query.Where("CASE WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他' WHEN latest_dry_weight.dry_weight IS NOT NULL AND ABS(a.weight_after - latest_dry_weight.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END = ?", "达标")
  2352. case 2:
  2353. query = query.Where("CASE WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他' WHEN latest_dry_weight.dry_weight IS NOT NULL AND ABS(a.weight_after - latest_dry_weight.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END = ?", "不达标")
  2354. case 3:
  2355. query = query.Where("CASE WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他' WHEN latest_dry_weight.dry_weight IS NOT NULL AND ABS(a.weight_after - latest_dry_weight.dry_weight) <= 0.3 THEN '达标' ELSE '不达标' END = ?", "其他")
  2356. }
  2357. var data2 []DialysisDataTwo
  2358. //// Count total records
  2359. if err := query.Find(&data2).Error; err != nil {
  2360. return nil, 0, fmt.Errorf("count query failed: %v", err)
  2361. }
  2362. total = int64(len(data2))
  2363. // Fetch data with pagination
  2364. var data []DialysisDataTwo
  2365. if err := query.Order("p.id, b.assessment_date").Offset(int(offset)).Limit(int(limit)).Find(&data).Error; err != nil {
  2366. return nil, 0, fmt.Errorf("data query failed: %v", err)
  2367. }
  2368. return data, total, nil
  2369. }
  2370. func GetNewDialysisWeightDetailTableTenTen(
  2371. user_org_id int64,
  2372. start_time int64,
  2373. end_time int64) ([]DialysisDataTwo, int64, error) {
  2374. // Build base query
  2375. query := readDb.Table("xt_assessment_before_dislysis b").
  2376. Select(`
  2377. p.dialysis_no AS dialysis_no,
  2378. p.name AS patient_name,
  2379. p.gender AS gender,
  2380. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2381. b.assessment_date AS assessment_date,
  2382. latest_dry_weight.dry_weight AS dry_weight,
  2383. b.weight_before AS weight_before,
  2384. a.weight_after AS weight_after,
  2385. (
  2386. SELECT a2.weight_after
  2387. FROM xt_assessment_after_dislysis a2
  2388. WHERE a2.patient_id = b.patient_id
  2389. AND a2.assessment_date < b.assessment_date
  2390. ORDER BY a2.assessment_date DESC LIMIT 1
  2391. ) AS last_weight_after
  2392. `).
  2393. Joins("JOIN xt_patients p ON p.id = b.patient_id").
  2394. Joins("LEFT JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  2395. Joins("JOIN (SELECT b2.patient_id, MAX(b2.assessment_date) AS max_assessment_date, MAX(b2.dry_weight) AS dry_weight FROM xt_assessment_before_dislysis b2 WHERE b2.user_org_id = ? AND b2.assessment_date BETWEEN ? AND ? GROUP BY b2.patient_id) latest_dry_weight ON latest_dry_weight.patient_id = b.patient_id", user_org_id, start_time, end_time).
  2396. Where("b.user_org_id = ?", user_org_id).
  2397. Where("b.assessment_date BETWEEN ? AND ?", start_time, end_time).
  2398. Where("b.assessment_date = latest_dry_weight.max_assessment_date").
  2399. Where("b.status = ?", 1)
  2400. // Calculate last_weight_after as a subquery in the HAVING clause
  2401. //query = query.Having("last_weight_after IS NOT NULL")
  2402. //var data2 []DialysisDataTwo
  2403. //Count total records
  2404. var total int64
  2405. if err := query.Count(&total).Error; err != nil {
  2406. return nil, 0, fmt.Errorf("count query failed: %v", err)
  2407. }
  2408. //total = int64(len(data2))
  2409. // Fetch data with pagination
  2410. var data []DialysisDataTwo
  2411. if err := query.Order("p.id, b.assessment_date").Find(&data).Error; err != nil {
  2412. return nil, 0, fmt.Errorf("data query failed: %v", err)
  2413. }
  2414. return data, total, nil
  2415. }
  2416. func GetNewDialysisWeightDetailTableTenThree(
  2417. user_org_id int64,
  2418. start_time int64,
  2419. end_time int64,
  2420. ) ([]DialysisDataTwo, int64, error) {
  2421. // Subquery to get the latest assessment date for each patient
  2422. subQuery := `
  2423. SELECT MAX(ctime) AS max_ctime, patient_id
  2424. FROM xt_patient_dryweight
  2425. WHERE user_org_id = ? AND ctime BETWEEN ? AND ? AND status = 1
  2426. GROUP BY patient_id
  2427. `
  2428. // Build main query to get the latest records for each patient
  2429. query := readDb.Table("xt_patient_dryweight b").
  2430. Select(`
  2431. p.dialysis_no AS dialysis_no,
  2432. p.name AS patient_name,
  2433. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2434. b.dry_weight AS dry_weight
  2435. `).
  2436. Joins("JOIN xt_patients p ON p.id = b.patient_id").
  2437. Joins("JOIN ("+subQuery+") AS latest ON b.patient_id = latest.patient_id AND b.ctime = latest.max_ctime", user_org_id, start_time, end_time).
  2438. Where("b.user_org_id = ?", user_org_id).
  2439. Where("b.ctime BETWEEN ? AND ?", start_time, end_time)
  2440. // Fetch data with pagination
  2441. var data []DialysisDataTwo
  2442. if err := query.Order("p.id").Find(&data).Error; err != nil {
  2443. return nil, 0, fmt.Errorf("data query failed: %v", err)
  2444. }
  2445. return data, int64(len(data)), nil
  2446. }
  2447. func GetNewDialysisWeightDetailTableTenSix(
  2448. user_org_id int64,
  2449. start_time int64,
  2450. end_time int64, dryType int64, page, limit int64) ([]DialysisDataTwo, int64, error) {
  2451. offset := (page - 1) * limit
  2452. var total int64
  2453. // Subquery to get the latest assessment date for each patient
  2454. subQuery := `
  2455. SELECT MAX(ctime) AS max_ctime, patient_id
  2456. FROM xt_patient_dryweight
  2457. WHERE user_org_id = ? AND ctime BETWEEN ? AND ? AND status = 1
  2458. GROUP BY patient_id
  2459. `
  2460. // Build main query to get the latest records for each patient
  2461. query := readDb.Table("xt_patient_dryweight b").
  2462. Select(`
  2463. p.dialysis_no AS dialysis_no,
  2464. p.name AS patient_name,
  2465. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2466. b.dry_weight AS dry_weight
  2467. `).
  2468. Joins("JOIN xt_patients p ON p.id = b.patient_id").
  2469. Joins("JOIN ("+subQuery+") AS latest ON b.patient_id = latest.patient_id AND b.ctime = latest.max_ctime", user_org_id, start_time, end_time).
  2470. Where("b.user_org_id = ?", user_org_id).
  2471. Where("b.ctime BETWEEN ? AND ?", start_time, end_time)
  2472. switch dryType {
  2473. case 5:
  2474. query = query.Where("b.dry_weight < ?", 40)
  2475. case 1:
  2476. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 40, 50)
  2477. case 2:
  2478. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 50, 60)
  2479. case 3:
  2480. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 60, 70)
  2481. case 4:
  2482. query = query.Where("b.dry_weight >= ?", 70)
  2483. case 6:
  2484. query = query.Where("b.dry_weight IS NULL OR b.dry_weight = ''")
  2485. }
  2486. // Fetch data with pagination
  2487. var data []DialysisDataTwo
  2488. if err := query.Order("p.id").Offset(int(offset)).Limit(int(limit)).Find(&data).Error; err != nil {
  2489. return nil, 0, fmt.Errorf("data query failed: %v", err)
  2490. }
  2491. var data2 []DialysisDataTwo
  2492. if err := query.Find(&data2).Error; err != nil {
  2493. return nil, 0, fmt.Errorf("count query failed: %v", err)
  2494. }
  2495. total = int64(len(data2))
  2496. // Fetch data with pagination
  2497. return data, total, nil
  2498. }
  2499. //func GetNewDialysisWeightDetailTableTenThree(
  2500. // user_org_id int64,
  2501. // start_time int64,
  2502. // end_time int64,
  2503. //) ([]DialysisDataTwo, int64, error) {
  2504. // var total int64
  2505. // // Build base query
  2506. // query := readDb.Table("xt_patient_dryweight b").
  2507. // Select(`
  2508. // p.dialysis_no AS dialysis_no,
  2509. // p.name AS patient_name,
  2510. // FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2511. // b.dry_weight AS dry_weight,
  2512. // `).
  2513. // Joins("JOIN xt_patients p ON p.id = b.patient_id").
  2514. // Where("b.user_org_id = ?", user_org_id).
  2515. // Where("b.ctime BETWEEN ? AND ?", start_time, end_time).
  2516. // Where("b.status = ?", 1)
  2517. //
  2518. // // Count total records
  2519. // if err := query.Count(&total).Error; err != nil {
  2520. // return nil, 0, fmt.Errorf("count query failed: %v", err)
  2521. // }
  2522. //
  2523. // // Fetch data with pagination
  2524. // var data []DialysisDataTwo
  2525. // if err := query.Order("p.id, b.assessment_date").Find(&data).Error; err != nil {
  2526. // return nil, 0, fmt.Errorf("data query failed: %v", err)
  2527. // }
  2528. //
  2529. // return data, total, nil
  2530. //}
  2531. func GetNewDialysisWeightDetailTableTenOne(
  2532. user_org_id int64,
  2533. start_time int64,
  2534. end_time int64) ([]DialysisDataTwo, error) {
  2535. // 构建基本查询
  2536. query := readDb.Table("xt_assessment_before_dislysis b").
  2537. Select(`
  2538. CASE
  2539. WHEN (
  2540. SELECT a2.weight_after
  2541. FROM xt_assessment_after_dislysis a2
  2542. JOIN xt_assessment_before_dislysis b2
  2543. ON a2.patient_id = b2.patient_id
  2544. AND a2.assessment_date = b2.assessment_date
  2545. WHERE b2.patient_id = b.patient_id
  2546. AND b2.assessment_date < b.assessment_date
  2547. ORDER BY b2.assessment_date DESC LIMIT 1
  2548. ) IS NOT NULL
  2549. THEN (b.weight_before - (
  2550. SELECT a2.weight_after
  2551. FROM xt_assessment_after_dislysis a2
  2552. JOIN xt_assessment_before_dislysis b2
  2553. ON a2.patient_id = b2.patient_id
  2554. AND a2.assessment_date = b2.assessment_date
  2555. WHERE b2.patient_id = b.patient_id
  2556. AND b2.assessment_date < b.assessment_date
  2557. ORDER BY b2.assessment_date DESC LIMIT 1
  2558. )) / (
  2559. SELECT a2.weight_after
  2560. FROM xt_assessment_after_dislysis a2
  2561. JOIN xt_assessment_before_dislysis b2
  2562. ON a2.patient_id = b2.patient_id
  2563. AND a2.assessment_date = b2.assessment_date
  2564. WHERE b2.patient_id = b.patient_id
  2565. AND b2.assessment_date < b.assessment_date
  2566. ORDER BY b2.assessment_date DESC LIMIT 1
  2567. )
  2568. ELSE NULL
  2569. END AS weight_add
  2570. `).
  2571. Joins("left JOIN xt_patients p ON p.id = b.patient_id").
  2572. Joins("left JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  2573. Where("b.user_org_id = ?", user_org_id).
  2574. Where("b.assessment_date >= ?", start_time).
  2575. Where("b.assessment_date <= ?", end_time).
  2576. Where("b.status = ?", 1)
  2577. var data []DialysisDataTwo
  2578. query.Order("p.id, b.assessment_date").Find(&data)
  2579. return data, nil
  2580. }
  2581. func GetNewDialysisWeightDetailTableTenTwo(
  2582. user_org_id int64,
  2583. start_time int64,
  2584. end_time int64) ([]DialysisDataTwo, error) {
  2585. // Construct the base query
  2586. query := readDb.Table("xt_assessment_before_dislysis b").
  2587. Select(`
  2588. (b.weight_before - b.dry_weight) / b.dry_weight * 100 AS weight_add
  2589. `).
  2590. Joins("left JOIN xt_patients p ON p.id = b.patient_id").
  2591. Joins("left JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  2592. Where("b.user_org_id = ?", user_org_id).
  2593. Where("b.assessment_date >= ?", start_time).
  2594. Where("b.assessment_date <= ?", end_time).
  2595. Where("b.status = ?", 1)
  2596. var data []DialysisDataTwo
  2597. query.Order("p.id, b.assessment_date").Find(&data)
  2598. return data, nil
  2599. }
  2600. // addType 条件处理
  2601. func addTypeCondition(query *gorm.DB, addType int64) {
  2602. }
  2603. // dryType 条件处理
  2604. func dryTypeCondition(query *gorm.DB, dryType int64) {
  2605. }
  2606. // afterType 条件处理
  2607. func afterTypeCondition(query *gorm.DB, afterType int64) {
  2608. switch afterType {
  2609. case 1:
  2610. query = query.Where("weight_status = '达标'")
  2611. case 2:
  2612. query = query.Where("weight_status = '不达标'")
  2613. case 3:
  2614. query = query.Where("weight_status = '其他'")
  2615. }
  2616. }
  2617. type DialysisDataThree struct {
  2618. DialysisNo string `json:"dialysis_no"`
  2619. PatientName string `json:"patient_name"`
  2620. Gender string `json:"gender"`
  2621. Age int `json:"age"`
  2622. AssessmentDate string `json:"assessment_date"`
  2623. DryWeight float64 `json:"dry_weight"`
  2624. PreDialysisBP string `json:"pre_dialysis_bp"`
  2625. PostDialysisBP string `json:"post_dialysis_bp"`
  2626. MonitoringBP string `json:"monitoring_bp"`
  2627. UltrafiltrationRate float64 `json:"ultrafiltration_rate"`
  2628. UltrafiltrationVol float64 `json:"ultrafiltration_vol"`
  2629. BPStatus string `json:"bp_status"`
  2630. ActualUltrafiltration float64 `json:"actual_ultrafiltration"`
  2631. }
  2632. // func GetNewDialysisBPDetailTableTen(user_org_id int64, start_time int64, end_time int64, addType, page, limit int64) ([]DialysisDataThree, int64, error) {
  2633. // offset := (page - 1) * limit
  2634. // var total int64
  2635. // var results []DialysisDataThree
  2636. // // SQL 查询
  2637. // query := `
  2638. // SELECT
  2639. // p.dialysis_no AS 透析号,
  2640. // p.name AS 患者姓名,
  2641. // p.gender AS 性别,
  2642. // FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS 年龄,
  2643. // b.assessment_date AS 透析日期,
  2644. // b.dry_weight AS 干体重,
  2645. // CONCAT(b.systolic_blood_pressure, '/', b.diastolic_blood_pressure) AS 透前血压,
  2646. // CONCAT(a.systolic_blood_pressure, '/', a.diastolic_blood_pressure) AS 透后血压,
  2647. // GROUP_CONCAT(CONCAT(m.systolic_blood_pressure, '/', m.diastolic_blood_pressure) ORDER BY m.monitoring_date ASC SEPARATOR ',') AS 监测记录血压,
  2648. // (SELECT mr.ultrafiltration_rate
  2649. // FROM xt_monitoring_record mr
  2650. // WHERE mr.patient_id = p.id AND mr.monitoring_date = b.assessment_date
  2651. // ORDER BY mr.operate_time DESC
  2652. // LIMIT 1) AS 超滤率,
  2653. // (SELECT mr.ultrafiltration_volume
  2654. // FROM xt_monitoring_record mr
  2655. // WHERE mr.patient_id = p.id AND mr.monitoring_date = b.assessment_date
  2656. // ORDER BY mr.operate_time DESC
  2657. // LIMIT 1) AS 超滤总量,
  2658. // CASE
  2659. // WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2660. // CASE
  2661. // WHEN b.systolic_blood_pressure < 140 OR b.diastolic_blood_pressure < 90 THEN '达标'
  2662. // ELSE '不达标'
  2663. // END
  2664. // WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2665. // CASE
  2666. // WHEN b.systolic_blood_pressure < 160 OR b.diastolic_blood_pressure < 90 THEN '达标'
  2667. // ELSE '不达标'
  2668. // END
  2669. // END AS 血压达标状态
  2670. // FROM
  2671. // xt_patients p
  2672. // JOIN
  2673. // xt_assessment_before_dislysis b ON p.id = b.patient_id
  2674. // JOIN
  2675. // xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date
  2676. // JOIN
  2677. // xt_monitoring_record m ON p.id = m.patient_id AND m.monitoring_date = b.assessment_date
  2678. // WHERE
  2679. // b.user_org_id = ?
  2680. // AND b.assessment_date >= ?
  2681. // AND b.assessment_date <= ?
  2682. // AND (
  2683. // (? = 1 AND CASE
  2684. // WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2685. // CASE
  2686. // WHEN b.systolic_blood_pressure < 140 OR b.diastolic_blood_pressure < 90 THEN 1
  2687. // ELSE 0
  2688. // END
  2689. // WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2690. // CASE
  2691. // WHEN b.systolic_blood_pressure < 160 OR b.diastolic_blood_pressure < 90 THEN 1
  2692. // ELSE 0
  2693. // END
  2694. // END = 1)
  2695. // OR
  2696. // (? = 2 AND CASE
  2697. // WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2698. // CASE
  2699. // WHEN b.systolic_blood_pressure >= 140 AND b.diastolic_blood_pressure >= 90 THEN 1
  2700. // ELSE 0
  2701. // END
  2702. // WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2703. // CASE
  2704. // WHEN b.systolic_blood_pressure >= 160 AND b.diastolic_blood_pressure >= 90 THEN 1
  2705. // ELSE 0
  2706. // END
  2707. // END = 1)
  2708. // )
  2709. // GROUP BY
  2710. // p.id, b.assessment_date
  2711. // ORDER BY
  2712. // p.id, b.assessment_date
  2713. // LIMIT ? OFFSET ?;
  2714. // `
  2715. //
  2716. // // 计算总数
  2717. // countQuery := `
  2718. // SELECT COUNT(*)
  2719. // FROM
  2720. // xt_patients p
  2721. // JOIN
  2722. // xt_assessment_before_dislysis b ON p.id = b.patient_id
  2723. // WHERE
  2724. // b.user_org_id = ?
  2725. // AND b.assessment_date >= ?
  2726. // AND b.assessment_date <= ?
  2727. // `
  2728. //
  2729. // // 执行统计查询
  2730. // if err := readDb.Raw(countQuery, user_org_id, start_time, end_time).Scan(&total).Error; err != nil {
  2731. // return nil, 0, fmt.Errorf("error calculating total count: %v", err)
  2732. // }
  2733. //
  2734. // // 执行数据查询
  2735. // if err := readDb.Raw(query, user_org_id, start_time, end_time, addType, addType, limit, offset).Scan(&results).Error; err != nil {
  2736. // return nil, 0, fmt.Errorf("error executing query: %v", err)
  2737. // }
  2738. //
  2739. // return results, total, nil
  2740. // }
  2741. func GetNewDialysisBPDetailTableTenOne(
  2742. user_org_id int64,
  2743. start_time int64,
  2744. end_time int64,
  2745. addType, page, limit int64,
  2746. ) ([]DialysisDataThree, int64, error) {
  2747. offset := (page - 1) * limit
  2748. var results []DialysisDataThree
  2749. var total int64
  2750. // 构建基本查询
  2751. query := readDb.Table("xt_assessment_after_dislysis b").
  2752. Select(`
  2753. p.dialysis_no AS dialysis_no,
  2754. b.actual_ultrafiltration as actual_ultrafiltration,
  2755. p.name AS patient_name,
  2756. p.gender AS gender,
  2757. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2758. b.assessment_date AS assessment_date,
  2759. b.dry_weight AS dry_weight,
  2760. CONCAT(a.systolic_blood_pressure, '/', a.diastolic_blood_pressure) AS pre_dialysis_bp,
  2761. CONCAT(b.systolic_blood_pressure, '/', b.diastolic_blood_pressure) AS post_dialysis_bp,
  2762. GROUP_CONCAT(CONCAT(m.systolic_blood_pressure, '/', m.diastolic_blood_pressure) ORDER BY m.monitoring_date ASC SEPARATOR ',') AS monitoring_bp,
  2763. (
  2764. SELECT mr.ultrafiltration_rate
  2765. FROM xt_monitoring_record mr
  2766. WHERE mr.patient_id = p.id
  2767. AND mr.monitoring_date = b.assessment_date
  2768. ORDER BY mr.operate_time DESC LIMIT 1
  2769. ) AS ultrafiltration_rate,
  2770. (
  2771. SELECT mr.ultrafiltration_volume
  2772. FROM xt_monitoring_record mr
  2773. WHERE mr.patient_id = p.id
  2774. AND mr.monitoring_date = b.assessment_date
  2775. ORDER BY mr.operate_time DESC LIMIT 1
  2776. ) AS ultrafiltration_vol,
  2777. CASE
  2778. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2779. CASE
  2780. WHEN b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 140 and b.diastolic_blood_pressure < 90 THEN '达标'
  2781. ELSE '不达标'
  2782. END
  2783. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2784. CASE
  2785. WHEN b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 160 AND b.diastolic_blood_pressure < 90 THEN '达标'
  2786. ELSE '不达标'
  2787. END
  2788. END AS bp_status
  2789. `).
  2790. Joins("JOIN xt_patients p ON p.id = b.patient_id").
  2791. Joins("JOIN xt_assessment_before_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date").
  2792. Joins("JOIN xt_monitoring_record m ON p.id = m.patient_id AND m.monitoring_date = b.assessment_date").
  2793. Where("b.user_org_id = ?", user_org_id).
  2794. Where("b.assessment_date >= ?", start_time).
  2795. Where("b.assessment_date <= ?", end_time).
  2796. Group("p.id, b.assessment_date")
  2797. // 根据传入的 addType 值动态构建条件
  2798. switch addType {
  2799. case 1:
  2800. query = query.Where(`
  2801. CASE
  2802. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2803. b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 140 AND b.diastolic_blood_pressure < 90
  2804. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2805. b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 160 AND b.diastolic_blood_pressure < 90
  2806. END`)
  2807. case 2:
  2808. query = query.Where(`
  2809. CASE
  2810. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2811. b.systolic_blood_pressure = 0 or b.diastolic_blood_pressure = 0 or b.systolic_blood_pressure >= 140 OR b.diastolic_blood_pressure >= 90
  2812. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2813. b.systolic_blood_pressure = 0 or b.diastolic_blood_pressure = 0 or b.systolic_blood_pressure >= 160 OR b.diastolic_blood_pressure >= 90
  2814. END`)
  2815. }
  2816. // 获取总记录数
  2817. if err := query.Count(&total).Error; err != nil {
  2818. return nil, 0, fmt.Errorf("count query failed: %v", err)
  2819. }
  2820. // 获取分页数据
  2821. if err := query.Order("p.id, b.assessment_date").
  2822. Offset(int(offset)).
  2823. Limit(int(limit)).
  2824. Scan(&results).Error; err != nil {
  2825. return nil, 0, fmt.Errorf("query execution failed: %v", err)
  2826. }
  2827. return results, total, nil
  2828. }
  2829. func GetNewDialysisBPDetailTableTen(
  2830. user_org_id int64,
  2831. start_time int64,
  2832. end_time int64,
  2833. addType, page, limit int64,
  2834. ) ([]DialysisDataThree, int64, error) {
  2835. offset := (page - 1) * limit
  2836. var results []DialysisDataThree
  2837. var total int64
  2838. // 构建基本查询
  2839. query := readDb.Table("xt_assessment_before_dislysis b").
  2840. Select(`
  2841. p.dialysis_no AS dialysis_no,
  2842. a.actual_ultrafiltration as actual_ultrafiltration,
  2843. p.name AS patient_name,
  2844. p.gender AS gender,
  2845. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  2846. b.assessment_date AS assessment_date,
  2847. b.dry_weight AS dry_weight,
  2848. CONCAT(b.systolic_blood_pressure, '/', b.diastolic_blood_pressure) AS pre_dialysis_bp,
  2849. CONCAT(a.systolic_blood_pressure, '/', a.diastolic_blood_pressure) AS post_dialysis_bp,
  2850. GROUP_CONCAT(CONCAT(m.systolic_blood_pressure, '/', m.diastolic_blood_pressure) ORDER BY m.monitoring_date ASC SEPARATOR ',') AS monitoring_bp,
  2851. (
  2852. SELECT mr.ultrafiltration_rate
  2853. FROM xt_monitoring_record mr
  2854. WHERE mr.patient_id = p.id
  2855. AND mr.monitoring_date = b.assessment_date
  2856. ORDER BY mr.operate_time DESC LIMIT 1
  2857. ) AS ultrafiltration_rate,
  2858. (
  2859. SELECT mr.ultrafiltration_volume
  2860. FROM xt_monitoring_record mr
  2861. WHERE mr.patient_id = p.id
  2862. AND mr.monitoring_date = b.assessment_date
  2863. ORDER BY mr.operate_time DESC LIMIT 1
  2864. ) AS ultrafiltration_vol,
  2865. CASE
  2866. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2867. CASE
  2868. WHEN b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 140 and b.diastolic_blood_pressure < 90 THEN '达标'
  2869. ELSE '不达标'
  2870. END
  2871. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2872. CASE
  2873. WHEN b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 160 AND b.diastolic_blood_pressure < 90 THEN '达标'
  2874. ELSE '不达标'
  2875. END
  2876. END AS bp_status
  2877. `).
  2878. Joins("JOIN xt_patients p ON p.id = b.patient_id").
  2879. Joins("JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date").
  2880. Joins("JOIN xt_monitoring_record m ON p.id = m.patient_id AND m.monitoring_date = b.assessment_date").
  2881. Where("b.user_org_id = ?", user_org_id).
  2882. Where("b.assessment_date >= ?", start_time).
  2883. Where("b.assessment_date <= ?", end_time).
  2884. Group("p.id, b.assessment_date")
  2885. // 根据传入的 addType 值动态构建条件
  2886. switch addType {
  2887. case 1:
  2888. query = query.Where(`
  2889. CASE
  2890. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2891. b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 140 AND b.diastolic_blood_pressure < 90
  2892. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2893. b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 160 AND b.diastolic_blood_pressure < 90
  2894. END`)
  2895. case 2:
  2896. query = query.Where(`
  2897. CASE
  2898. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2899. b.systolic_blood_pressure = 0 or b.diastolic_blood_pressure = 0 or b.systolic_blood_pressure >= 140 OR b.diastolic_blood_pressure >= 90
  2900. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2901. b.systolic_blood_pressure = 0 or b.diastolic_blood_pressure = 0 or b.systolic_blood_pressure >= 160 OR b.diastolic_blood_pressure >= 90
  2902. END`)
  2903. }
  2904. // 获取总记录数
  2905. if err := query.Count(&total).Error; err != nil {
  2906. return nil, 0, fmt.Errorf("count query failed: %v", err)
  2907. }
  2908. // 获取分页数据
  2909. if err := query.Order("p.id, b.assessment_date").
  2910. Offset(int(offset)).
  2911. Limit(int(limit)).
  2912. Scan(&results).Error; err != nil {
  2913. return nil, 0, fmt.Errorf("query execution failed: %v", err)
  2914. }
  2915. return results, total, nil
  2916. }
  2917. func GetNewDialysisBPDetailTableTenThree(
  2918. user_org_id int64,
  2919. start_time int64,
  2920. end_time int64,
  2921. ) (item []otherItemAmount, err error) {
  2922. var results []DialysisDataThree
  2923. var total int64
  2924. // 构建基本查询
  2925. query := readDb.Table("xt_assessment_before_dislysis b").
  2926. Select(`
  2927. CASE
  2928. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2929. CASE
  2930. WHEN b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 140 AND b.diastolic_blood_pressure < 90 THEN '达标'
  2931. ELSE '不达标'
  2932. END
  2933. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2934. CASE
  2935. WHEN b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 160 AND b.diastolic_blood_pressure < 90 THEN '达标'
  2936. ELSE '不达标'
  2937. END
  2938. END AS bp_status
  2939. `).
  2940. Joins("JOIN xt_patients p ON p.id = b.patient_id").
  2941. Joins("JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date").
  2942. Where("b.user_org_id = ?", user_org_id).
  2943. Where("b.assessment_date >= ?", start_time).
  2944. Where("b.assessment_date <= ?", end_time).
  2945. Group("p.id, b.assessment_date")
  2946. // 获取总记录数
  2947. query.Count(&total)
  2948. // 获取分页数据
  2949. query.Order("p.id, b.assessment_date").Scan(&results)
  2950. var metStandard, unmetStandard int
  2951. for _, result := range results {
  2952. if result.BPStatus == "达标" {
  2953. metStandard++
  2954. } else {
  2955. unmetStandard++
  2956. }
  2957. }
  2958. if total > 0 {
  2959. metPercentage := float64(metStandard) / float64(total) * 100
  2960. unmetPercentage := float64(unmetStandard) / float64(total) * 100
  2961. fmt.Printf("Total patients: %d\n", total)
  2962. fmt.Printf("Met standard: %d (%.2f%%)\n", metStandard, metPercentage)
  2963. fmt.Printf("Unmet standard: %d (%.2f%%)\n", unmetStandard, unmetPercentage)
  2964. var items otherItemAmount
  2965. items.Name = "达标患者"
  2966. items.Ratio = strconv.FormatFloat(metPercentage, 'f', 1, 32)
  2967. items.Total = int64(metStandard)
  2968. item = append(item, items)
  2969. var items2 otherItemAmount
  2970. items2.Name = "未达标患者"
  2971. items2.Ratio = strconv.FormatFloat(unmetPercentage, 'f', 1, 32)
  2972. items2.Total = int64(unmetStandard)
  2973. item = append(item, items2)
  2974. }
  2975. return
  2976. }
  2977. func GetNewDialysisBPDetailTableTenFour(
  2978. user_org_id int64,
  2979. start_time int64,
  2980. end_time int64,
  2981. ) (item []otherItemAmount, err error) {
  2982. var results []DialysisDataThree
  2983. var total int64
  2984. // 构建基本查询
  2985. query := readDb.Table("xt_assessment_after_dislysis b").
  2986. Select(`
  2987. CASE
  2988. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
  2989. CASE
  2990. WHEN b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 140 AND b.diastolic_blood_pressure < 90 THEN '达标'
  2991. ELSE '不达标'
  2992. END
  2993. WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
  2994. CASE
  2995. WHEN b.systolic_blood_pressure <> 0 and b.diastolic_blood_pressure <> 0 and b.systolic_blood_pressure < 160 AND b.diastolic_blood_pressure < 90 THEN '达标'
  2996. ELSE '不达标'
  2997. END
  2998. END AS bp_status
  2999. `).
  3000. Joins("JOIN xt_patients p ON p.id = b.patient_id").
  3001. Joins("JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date").
  3002. Where("b.user_org_id = ?", user_org_id).
  3003. Where("b.assessment_date >= ?", start_time).
  3004. Where("b.assessment_date <= ?", end_time).
  3005. Group("p.id, b.assessment_date")
  3006. // 获取总记录数
  3007. query.Count(&total)
  3008. // 获取分页数据
  3009. query.Order("p.id, b.assessment_date").Scan(&results)
  3010. var metStandard, unmetStandard int
  3011. for _, result := range results {
  3012. if result.BPStatus == "达标" {
  3013. metStandard++
  3014. } else {
  3015. unmetStandard++
  3016. }
  3017. }
  3018. if total > 0 {
  3019. metPercentage := float64(metStandard) / float64(total) * 100
  3020. unmetPercentage := float64(unmetStandard) / float64(total) * 100
  3021. fmt.Printf("Total patients: %d\n", total)
  3022. fmt.Printf("Met standard: %d (%.2f%%)\n", metStandard, metPercentage)
  3023. fmt.Printf("Unmet standard: %d (%.2f%%)\n", unmetStandard, unmetPercentage)
  3024. var items otherItemAmount
  3025. items.Name = "达标患者"
  3026. items.Ratio = strconv.FormatFloat(metPercentage, 'f', 1, 32)
  3027. items.Total = int64(metStandard)
  3028. item = append(item, items)
  3029. var items2 otherItemAmount
  3030. items2.Name = "未达标患者"
  3031. items2.Ratio = strconv.FormatFloat(unmetPercentage, 'f', 1, 32)
  3032. items2.Total = int64(unmetStandard)
  3033. item = append(item, items2)
  3034. }
  3035. return
  3036. }
  3037. func GetNewDialysisWeightDetailTableTenT(
  3038. user_org_id int64,
  3039. start_time int64,
  3040. end_time int64,
  3041. addType, dryType, afterType, page, limit int64, keyword string, item_type int64) ([]DialysisDataTwo, int64, error) {
  3042. offset := (page - 1) * limit
  3043. //var dialysisData []DialysisDataTwo
  3044. var total int64
  3045. keyword = "%" + keyword + "%"
  3046. var query *gorm.DB
  3047. if item_type == 0 || item_type == 1 { //体重增加,以透后体重为分母
  3048. // 构建基本查询
  3049. query = readDb.Table("xt_assessment_before_dislysis b").
  3050. Select(`
  3051. p.dialysis_no AS dialysis_no,
  3052. p.name AS patient_name,
  3053. p.gender AS gender,
  3054. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  3055. b.assessment_date AS assessment_date,
  3056. b.dry_weight AS dry_weight,
  3057. b.weight_before AS weight_before,
  3058. a.weight_after AS weight_after,
  3059. (
  3060. SELECT a2.weight_after
  3061. FROM xt_assessment_after_dislysis a2
  3062. JOIN xt_assessment_before_dislysis b2
  3063. ON a2.patient_id = b2.patient_id
  3064. AND a2.assessment_date = b2.assessment_date
  3065. WHERE b2.patient_id = b.patient_id
  3066. AND b2.assessment_date < b.assessment_date
  3067. ORDER BY b2.assessment_date DESC LIMIT 1
  3068. ) AS last_weight_after,
  3069. CASE
  3070. WHEN
  3071. a.weight_after and b.dry_weight
  3072. IS NOT NULL
  3073. THEN a.weight_after - b.dry_weight
  3074. ELSE NULL
  3075. END AS weight_add,
  3076. CASE
  3077. WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他'
  3078. WHEN b.dry_weight IS NOT NULL THEN
  3079. CASE
  3080. WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  3081. ELSE '不达标'
  3082. END
  3083. ELSE '其他'
  3084. END AS weight_status
  3085. `).
  3086. Joins("JOIN xt_patients p ON p.id = b.patient_id and p.name like ?", keyword).
  3087. Joins("left JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  3088. Where("b.user_org_id = ?", user_org_id).
  3089. Where("b.assessment_date >= ?", start_time).
  3090. Where("b.assessment_date <= ?", end_time).
  3091. Where("b.status = ?", 1)
  3092. } else {
  3093. query = readDb.Table("xt_assessment_before_dislysis b").
  3094. Select(`
  3095. p.dialysis_no AS dialysis_no,
  3096. p.name AS patient_name,
  3097. p.gender AS gender,
  3098. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  3099. b.assessment_date AS assessment_date,
  3100. b.dry_weight AS dry_weight,
  3101. b.weight_before AS weight_before,
  3102. a.weight_after AS weight_after,
  3103. (
  3104. SELECT a2.weight_after
  3105. FROM xt_assessment_after_dislysis a2
  3106. JOIN xt_assessment_before_dislysis b2
  3107. ON a2.patient_id = b2.patient_id
  3108. AND a2.assessment_date = b2.assessment_date
  3109. WHERE b2.patient_id = b.patient_id
  3110. AND b2.assessment_date < b.assessment_date
  3111. ORDER BY b2.assessment_date DESC LIMIT 1
  3112. ) AS last_weight_after,
  3113. CASE
  3114. WHEN
  3115. a.weight_after and b.dry_weight
  3116. IS NOT NULL
  3117. THEN a.weight_after - b.dry_weight
  3118. ELSE NULL
  3119. END AS weight_add,
  3120. CASE
  3121. WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他'
  3122. WHEN b.dry_weight IS NOT NULL THEN
  3123. CASE
  3124. WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  3125. ELSE '不达标'
  3126. END
  3127. ELSE '其他'
  3128. END AS weight_status
  3129. `).
  3130. Joins("JOIN xt_patients p ON p.id = b.patient_id and p.name like ?", keyword).
  3131. Joins("left JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  3132. Where("b.user_org_id = ?", user_org_id).
  3133. Where("b.assessment_date >= ?", start_time).
  3134. Where("b.assessment_date <= ?", end_time).
  3135. Where("b.status = ?", 1)
  3136. }
  3137. switch dryType {
  3138. case 5:
  3139. query = query.Where("b.dry_weight < ?", 40)
  3140. case 1:
  3141. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 40, 50)
  3142. case 2:
  3143. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 50, 60)
  3144. case 3:
  3145. query = query.Where("b.dry_weight >= ? AND b.dry_weight < ?", 60, 70)
  3146. case 4:
  3147. query = query.Where("b.dry_weight >= ?", 70)
  3148. case 6:
  3149. query = query.Where("b.dry_weight IS NULL OR b.dry_weight = ''")
  3150. }
  3151. if item_type == 0 || item_type == 1 {
  3152. switch addType {
  3153. case 1:
  3154. query = query.Where(`
  3155. (
  3156. CASE
  3157. WHEN (
  3158. SELECT a2.weight_after
  3159. FROM xt_assessment_after_dislysis a2
  3160. JOIN xt_assessment_before_dislysis b2
  3161. ON a2.patient_id = b2.patient_id
  3162. AND a2.assessment_date = b2.assessment_date
  3163. WHERE b2.patient_id = b.patient_id
  3164. AND b2.assessment_date < b.assessment_date
  3165. ORDER BY b2.assessment_date DESC LIMIT 1
  3166. ) IS NOT NULL
  3167. THEN (b.weight_before - (
  3168. SELECT a2.weight_after
  3169. FROM xt_assessment_after_dislysis a2
  3170. JOIN xt_assessment_before_dislysis b2
  3171. ON a2.patient_id = b2.patient_id
  3172. AND a2.assessment_date = b2.assessment_date
  3173. WHERE b2.patient_id = b.patient_id
  3174. AND b2.assessment_date < b.assessment_date
  3175. ORDER BY b2.assessment_date DESC LIMIT 1
  3176. )) / (
  3177. SELECT a2.weight_after
  3178. FROM xt_assessment_after_dislysis a2
  3179. JOIN xt_assessment_before_dislysis b2
  3180. ON a2.patient_id = b2.patient_id
  3181. AND a2.assessment_date = b2.assessment_date
  3182. WHERE b2.patient_id = b.patient_id
  3183. AND b2.assessment_date < b.assessment_date
  3184. ORDER BY b2.assessment_date DESC LIMIT 1
  3185. )
  3186. ELSE NULL
  3187. END
  3188. ) <= 0.03
  3189. `)
  3190. case 2:
  3191. query = query.Where(`
  3192. (
  3193. CASE
  3194. WHEN (
  3195. SELECT a2.weight_after
  3196. FROM xt_assessment_after_dislysis a2
  3197. JOIN xt_assessment_before_dislysis b2
  3198. ON a2.patient_id = b2.patient_id
  3199. AND a2.assessment_date = b2.assessment_date
  3200. WHERE b2.patient_id = b.patient_id
  3201. AND b2.assessment_date < b.assessment_date
  3202. ORDER BY b2.assessment_date DESC LIMIT 1
  3203. ) IS NOT NULL
  3204. THEN (b.weight_before - (
  3205. SELECT a2.weight_after
  3206. FROM xt_assessment_after_dislysis a2
  3207. JOIN xt_assessment_before_dislysis b2
  3208. ON a2.patient_id = b2.patient_id
  3209. AND a2.assessment_date = b2.assessment_date
  3210. WHERE b2.patient_id = b.patient_id
  3211. AND b2.assessment_date < b.assessment_date
  3212. ORDER BY b2.assessment_date DESC LIMIT 1
  3213. )) / (
  3214. SELECT a2.weight_after
  3215. FROM xt_assessment_after_dislysis a2
  3216. JOIN xt_assessment_before_dislysis b2
  3217. ON a2.patient_id = b2.patient_id
  3218. AND a2.assessment_date = b2.assessment_date
  3219. WHERE b2.patient_id = b.patient_id
  3220. AND b2.assessment_date < b.assessment_date
  3221. ORDER BY b2.assessment_date DESC LIMIT 1
  3222. )
  3223. ELSE NULL
  3224. END
  3225. ) > 0.03 AND (
  3226. CASE
  3227. WHEN (
  3228. SELECT a2.weight_after
  3229. FROM xt_assessment_after_dislysis a2
  3230. JOIN xt_assessment_before_dislysis b2
  3231. ON a2.patient_id = b2.patient_id
  3232. AND a2.assessment_date = b2.assessment_date
  3233. WHERE b2.patient_id = b.patient_id
  3234. AND b2.assessment_date < b.assessment_date
  3235. ORDER BY b2.assessment_date DESC LIMIT 1
  3236. ) IS NOT NULL
  3237. THEN (b.weight_before - (
  3238. SELECT a2.weight_after
  3239. FROM xt_assessment_after_dislysis a2
  3240. JOIN xt_assessment_before_dislysis b2
  3241. ON a2.patient_id = b2.patient_id
  3242. AND a2.assessment_date = b2.assessment_date
  3243. WHERE b2.patient_id = b.patient_id
  3244. AND b2.assessment_date < b.assessment_date
  3245. ORDER BY b2.assessment_date DESC LIMIT 1
  3246. )) / (
  3247. SELECT a2.weight_after
  3248. FROM xt_assessment_after_dislysis a2
  3249. JOIN xt_assessment_before_dislysis b2
  3250. ON a2.patient_id = b2.patient_id
  3251. AND a2.assessment_date = b2.assessment_date
  3252. WHERE b2.patient_id = b.patient_id
  3253. AND b2.assessment_date < b.assessment_date
  3254. ORDER BY b2.assessment_date DESC LIMIT 1
  3255. )
  3256. ELSE NULL
  3257. END
  3258. ) < 0.05
  3259. `)
  3260. case 3:
  3261. query = query.Where(`
  3262. (
  3263. CASE
  3264. WHEN (
  3265. SELECT a2.weight_after
  3266. FROM xt_assessment_after_dislysis a2
  3267. JOIN xt_assessment_before_dislysis b2
  3268. ON a2.patient_id = b2.patient_id
  3269. AND a2.assessment_date = b2.assessment_date
  3270. WHERE b2.patient_id = b.patient_id
  3271. AND b2.assessment_date < b.assessment_date
  3272. ORDER BY b2.assessment_date DESC LIMIT 1
  3273. ) IS NOT NULL
  3274. THEN (b.weight_before - (
  3275. SELECT a2.weight_after
  3276. FROM xt_assessment_after_dislysis a2
  3277. JOIN xt_assessment_before_dislysis b2
  3278. ON a2.patient_id = b2.patient_id
  3279. AND a2.assessment_date = b2.assessment_date
  3280. WHERE b2.patient_id = b.patient_id
  3281. AND b2.assessment_date < b.assessment_date
  3282. ORDER BY b2.assessment_date DESC LIMIT 1
  3283. )) / (
  3284. SELECT a2.weight_after
  3285. FROM xt_assessment_after_dislysis a2
  3286. JOIN xt_assessment_before_dislysis b2
  3287. ON a2.patient_id = b2.patient_id
  3288. AND a2.assessment_date = b2.assessment_date
  3289. WHERE b2.patient_id = b.patient_id
  3290. AND b2.assessment_date < b.assessment_date
  3291. ORDER BY b2.assessment_date DESC LIMIT 1
  3292. )
  3293. ELSE NULL
  3294. END
  3295. ) >= 0.05
  3296. `)
  3297. case 4:
  3298. query = query.Where(`
  3299. (
  3300. SELECT a2.weight_after
  3301. FROM xt_assessment_after_dislysis a2
  3302. JOIN xt_assessment_before_dislysis b2
  3303. ON a2.patient_id = b2.patient_id
  3304. AND a2.assessment_date = b2.assessment_date
  3305. WHERE b2.patient_id = b.patient_id
  3306. AND b2.assessment_date < b.assessment_date
  3307. ORDER BY b2.assessment_date DESC LIMIT 1
  3308. ) IS NULL
  3309. `)
  3310. }
  3311. } else {
  3312. switch addType {
  3313. case 1:
  3314. query = query.Where(`
  3315. (
  3316. CASE
  3317. WHEN b.weight_before and b.dry_weight IS NOT NULL
  3318. THEN (b.weight_before - b.dry_weight) / (
  3319. b.dry_weight
  3320. )
  3321. ELSE NULL
  3322. END
  3323. ) <= 0.03
  3324. `)
  3325. case 2:
  3326. query = query.Where(`
  3327. (
  3328. CASE
  3329. WHEN b.weight_before and b.dry_weight IS NOT NULL
  3330. THEN (b.weight_before - b.dry_weight) / (
  3331. b.dry_weight
  3332. )
  3333. ELSE NULL
  3334. END
  3335. ) > 0.03 AND (
  3336. CASE
  3337. WHEN b.weight_before and b.dry_weight IS NOT NULL
  3338. THEN (b.weight_before - b.dry_weight) / (
  3339. b.dry_weight
  3340. )
  3341. ELSE NULL
  3342. END
  3343. ) < 0.05
  3344. `)
  3345. case 3:
  3346. query = query.Where(`
  3347. (
  3348. CASE
  3349. WHEN b.weight_before and b.dry_weight IS NOT NULL
  3350. THEN (b.weight_before - b.dry_weight) / (
  3351. b.dry_weight
  3352. )
  3353. ELSE NULL
  3354. END
  3355. ) >= 0.05
  3356. `)
  3357. case 4:
  3358. query = query.Where(`b.weight_before and b.dry_weight IS NULL`)
  3359. }
  3360. }
  3361. switch afterType {
  3362. case 1:
  3363. query = query.Where(`
  3364. CASE
  3365. WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他'
  3366. WHEN b.dry_weight IS NOT NULL THEN
  3367. CASE
  3368. WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  3369. ELSE '不达标'
  3370. END
  3371. ELSE '其他'
  3372. END = ?`, "达标")
  3373. case 2:
  3374. query = query.Where(`
  3375. CASE
  3376. WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他'
  3377. WHEN b.dry_weight IS NOT NULL THEN
  3378. CASE
  3379. WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  3380. ELSE '不达标'
  3381. END
  3382. ELSE '其他'
  3383. END = ?`, "不达标")
  3384. case 3:
  3385. query = query.Where(`
  3386. CASE
  3387. WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他'
  3388. WHEN b.dry_weight IS NOT NULL THEN
  3389. CASE
  3390. WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  3391. ELSE '不达标'
  3392. END
  3393. ELSE '其他'
  3394. END = ?`, "其他")
  3395. }
  3396. //// 获取总记录数
  3397. if err := query.Count(&total).Error; err != nil {
  3398. return nil, 0, fmt.Errorf("count query failed: %v", err)
  3399. }
  3400. var data []DialysisDataTwo
  3401. query.Order("p.id, b.assessment_date").Offset(int(offset)).Limit(int(limit)).Find(&data)
  3402. return data, total, nil
  3403. }
  3404. func GetNewDialysisWeightDetailTableTenTenOne(
  3405. user_org_id int64,
  3406. start_time int64,
  3407. end_time int64, add_type int64) ([]DialysisDataTwo, int64, error) {
  3408. var total int64
  3409. // 构建基本查询
  3410. query := readDb.Table("xt_assessment_before_dislysis b").
  3411. Select(`
  3412. p.dialysis_no AS dialysis_no,
  3413. p.name AS patient_name,
  3414. p.gender AS gender,
  3415. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  3416. b.assessment_date AS assessment_date,
  3417. b.dry_weight AS dry_weight,
  3418. b.weight_before AS weight_before,
  3419. a.weight_after AS weight_after,
  3420. (
  3421. SELECT a2.weight_after
  3422. FROM xt_assessment_after_dislysis a2
  3423. JOIN xt_assessment_before_dislysis b2
  3424. ON a2.patient_id = b2.patient_id
  3425. AND a2.assessment_date = b2.assessment_date
  3426. WHERE b2.patient_id = b.patient_id
  3427. AND b2.assessment_date < b.assessment_date
  3428. ORDER BY b2.assessment_date DESC LIMIT 1
  3429. ) AS last_weight_after,
  3430. CASE
  3431. WHEN (
  3432. SELECT a2.weight_after
  3433. FROM xt_assessment_after_dislysis a2
  3434. JOIN xt_assessment_before_dislysis b2
  3435. ON a2.patient_id = b2.patient_id
  3436. AND a2.assessment_date = b2.assessment_date
  3437. WHERE b2.patient_id = b.patient_id
  3438. AND b2.assessment_date < b.assessment_date
  3439. ORDER BY b2.assessment_date DESC LIMIT 1
  3440. ) IS NOT NULL
  3441. THEN (b.weight_before - (
  3442. SELECT a2.weight_after
  3443. FROM xt_assessment_after_dislysis a2
  3444. JOIN xt_assessment_before_dislysis b2
  3445. ON a2.patient_id = b2.patient_id
  3446. AND a2.assessment_date = b2.assessment_date
  3447. WHERE b2.patient_id = b.patient_id
  3448. AND b2.assessment_date < b.assessment_date
  3449. ORDER BY b2.assessment_date DESC LIMIT 1
  3450. )) / (
  3451. SELECT a2.weight_after
  3452. FROM xt_assessment_after_dislysis a2
  3453. JOIN xt_assessment_before_dislysis b2
  3454. ON a2.patient_id = b2.patient_id
  3455. AND a2.assessment_date = b2.assessment_date
  3456. WHERE b2.patient_id = b.patient_id
  3457. AND b2.assessment_date < b.assessment_date
  3458. ORDER BY b2.assessment_date DESC LIMIT 1
  3459. )
  3460. ELSE NULL
  3461. END AS weight_add,
  3462. CASE
  3463. WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他'
  3464. WHEN b.dry_weight IS NOT NULL THEN
  3465. CASE
  3466. WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  3467. ELSE '不达标'
  3468. END
  3469. ELSE '其他'
  3470. END AS weight_status
  3471. `).
  3472. Joins("JOIN xt_patients p ON p.id = b.patient_id ").
  3473. Joins("left JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  3474. Where("b.user_org_id = ?", user_org_id).
  3475. Where("b.assessment_date >= ?", start_time).
  3476. Where("b.assessment_date <= ?", end_time).
  3477. Where("b.status = ?", 1)
  3478. switch add_type {
  3479. case 1:
  3480. query = query.Where(`
  3481. (
  3482. CASE
  3483. WHEN (
  3484. SELECT a2.weight_after
  3485. FROM xt_assessment_after_dislysis a2
  3486. JOIN xt_assessment_before_dislysis b2
  3487. ON a2.patient_id = b2.patient_id
  3488. AND a2.assessment_date = b2.assessment_date
  3489. WHERE b2.patient_id = b.patient_id
  3490. AND b2.assessment_date < b.assessment_date
  3491. ORDER BY b2.assessment_date DESC LIMIT 1
  3492. ) IS NOT NULL
  3493. THEN (b.weight_before - (
  3494. SELECT a2.weight_after
  3495. FROM xt_assessment_after_dislysis a2
  3496. JOIN xt_assessment_before_dislysis b2
  3497. ON a2.patient_id = b2.patient_id
  3498. AND a2.assessment_date = b2.assessment_date
  3499. WHERE b2.patient_id = b.patient_id
  3500. AND b2.assessment_date < b.assessment_date
  3501. ORDER BY b2.assessment_date DESC LIMIT 1
  3502. )) / (
  3503. SELECT a2.weight_after
  3504. FROM xt_assessment_after_dislysis a2
  3505. JOIN xt_assessment_before_dislysis b2
  3506. ON a2.patient_id = b2.patient_id
  3507. AND a2.assessment_date = b2.assessment_date
  3508. WHERE b2.patient_id = b.patient_id
  3509. AND b2.assessment_date < b.assessment_date
  3510. ORDER BY b2.assessment_date DESC LIMIT 1
  3511. )
  3512. ELSE NULL
  3513. END
  3514. ) <= 0.03
  3515. `)
  3516. case 2:
  3517. query = query.Where(`
  3518. (
  3519. CASE
  3520. WHEN (
  3521. SELECT a2.weight_after
  3522. FROM xt_assessment_after_dislysis a2
  3523. JOIN xt_assessment_before_dislysis b2
  3524. ON a2.patient_id = b2.patient_id
  3525. AND a2.assessment_date = b2.assessment_date
  3526. WHERE b2.patient_id = b.patient_id
  3527. AND b2.assessment_date < b.assessment_date
  3528. ORDER BY b2.assessment_date DESC LIMIT 1
  3529. ) IS NOT NULL
  3530. THEN (b.weight_before - (
  3531. SELECT a2.weight_after
  3532. FROM xt_assessment_after_dislysis a2
  3533. JOIN xt_assessment_before_dislysis b2
  3534. ON a2.patient_id = b2.patient_id
  3535. AND a2.assessment_date = b2.assessment_date
  3536. WHERE b2.patient_id = b.patient_id
  3537. AND b2.assessment_date < b.assessment_date
  3538. ORDER BY b2.assessment_date DESC LIMIT 1
  3539. )) / (
  3540. SELECT a2.weight_after
  3541. FROM xt_assessment_after_dislysis a2
  3542. JOIN xt_assessment_before_dislysis b2
  3543. ON a2.patient_id = b2.patient_id
  3544. AND a2.assessment_date = b2.assessment_date
  3545. WHERE b2.patient_id = b.patient_id
  3546. AND b2.assessment_date < b.assessment_date
  3547. ORDER BY b2.assessment_date DESC LIMIT 1
  3548. )
  3549. ELSE NULL
  3550. END
  3551. ) > 0.03 AND (
  3552. CASE
  3553. WHEN (
  3554. SELECT a2.weight_after
  3555. FROM xt_assessment_after_dislysis a2
  3556. JOIN xt_assessment_before_dislysis b2
  3557. ON a2.patient_id = b2.patient_id
  3558. AND a2.assessment_date = b2.assessment_date
  3559. WHERE b2.patient_id = b.patient_id
  3560. AND b2.assessment_date < b.assessment_date
  3561. ORDER BY b2.assessment_date DESC LIMIT 1
  3562. ) IS NOT NULL
  3563. THEN (b.weight_before - (
  3564. SELECT a2.weight_after
  3565. FROM xt_assessment_after_dislysis a2
  3566. JOIN xt_assessment_before_dislysis b2
  3567. ON a2.patient_id = b2.patient_id
  3568. AND a2.assessment_date = b2.assessment_date
  3569. WHERE b2.patient_id = b.patient_id
  3570. AND b2.assessment_date < b.assessment_date
  3571. ORDER BY b2.assessment_date DESC LIMIT 1
  3572. )) / (
  3573. SELECT a2.weight_after
  3574. FROM xt_assessment_after_dislysis a2
  3575. JOIN xt_assessment_before_dislysis b2
  3576. ON a2.patient_id = b2.patient_id
  3577. AND a2.assessment_date = b2.assessment_date
  3578. WHERE b2.patient_id = b.patient_id
  3579. AND b2.assessment_date < b.assessment_date
  3580. ORDER BY b2.assessment_date DESC LIMIT 1
  3581. )
  3582. ELSE NULL
  3583. END
  3584. ) < 0.05
  3585. `)
  3586. case 3:
  3587. query = query.Where(`
  3588. (
  3589. CASE
  3590. WHEN (
  3591. SELECT a2.weight_after
  3592. FROM xt_assessment_after_dislysis a2
  3593. JOIN xt_assessment_before_dislysis b2
  3594. ON a2.patient_id = b2.patient_id
  3595. AND a2.assessment_date = b2.assessment_date
  3596. WHERE b2.patient_id = b.patient_id
  3597. AND b2.assessment_date < b.assessment_date
  3598. ORDER BY b2.assessment_date DESC LIMIT 1
  3599. ) IS NOT NULL
  3600. THEN (b.weight_before - (
  3601. SELECT a2.weight_after
  3602. FROM xt_assessment_after_dislysis a2
  3603. JOIN xt_assessment_before_dislysis b2
  3604. ON a2.patient_id = b2.patient_id
  3605. AND a2.assessment_date = b2.assessment_date
  3606. WHERE b2.patient_id = b.patient_id
  3607. AND b2.assessment_date < b.assessment_date
  3608. ORDER BY b2.assessment_date DESC LIMIT 1
  3609. )) / (
  3610. SELECT a2.weight_after
  3611. FROM xt_assessment_after_dislysis a2
  3612. JOIN xt_assessment_before_dislysis b2
  3613. ON a2.patient_id = b2.patient_id
  3614. AND a2.assessment_date = b2.assessment_date
  3615. WHERE b2.patient_id = b.patient_id
  3616. AND b2.assessment_date < b.assessment_date
  3617. ORDER BY b2.assessment_date DESC LIMIT 1
  3618. )
  3619. ELSE NULL
  3620. END
  3621. ) >= 0.05
  3622. `)
  3623. case 4:
  3624. query = query.Where(`
  3625. (
  3626. SELECT a2.weight_after
  3627. FROM xt_assessment_after_dislysis a2
  3628. JOIN xt_assessment_before_dislysis b2
  3629. ON a2.patient_id = b2.patient_id
  3630. AND a2.assessment_date = b2.assessment_date
  3631. WHERE b2.patient_id = b.patient_id
  3632. AND b2.assessment_date < b.assessment_date
  3633. ORDER BY b2.assessment_date DESC LIMIT 1
  3634. ) IS NULL
  3635. `)
  3636. }
  3637. //// 获取总记录数
  3638. if err := query.Count(&total).Error; err != nil {
  3639. return nil, 0, fmt.Errorf("count query failed: %v", err)
  3640. }
  3641. var data []DialysisDataTwo
  3642. query.Order("p.id, b.assessment_date").Find(&data)
  3643. return data, total, nil
  3644. }
  3645. func GetNewDialysisWeightDetailTableTenTenTwo(
  3646. user_org_id int64,
  3647. start_time int64,
  3648. end_time int64, add_type int64) ([]DialysisDataTwo, int64, error) {
  3649. var total int64
  3650. // 构建基本查询
  3651. query := readDb.Table("xt_assessment_before_dislysis b").
  3652. Select(`
  3653. p.dialysis_no AS dialysis_no,
  3654. p.name AS patient_name,
  3655. p.gender AS gender,
  3656. FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
  3657. b.assessment_date AS assessment_date,
  3658. b.dry_weight AS dry_weight,
  3659. b.weight_before AS weight_before,
  3660. a.weight_after AS weight_after,
  3661. (
  3662. SELECT a2.weight_after
  3663. FROM xt_assessment_after_dislysis a2
  3664. JOIN xt_assessment_before_dislysis b2
  3665. ON a2.patient_id = b2.patient_id
  3666. AND a2.assessment_date = b2.assessment_date
  3667. WHERE b2.patient_id = b.patient_id
  3668. AND b2.assessment_date < b.assessment_date
  3669. ORDER BY b2.assessment_date DESC LIMIT 1
  3670. ) AS last_weight_after,
  3671. CASE
  3672. WHEN b.dry_weight and b.weight_before IS NOT NULL
  3673. THEN (b.weight_before - b.dry_weight) / b.dry_weight
  3674. ELSE NULL
  3675. END AS weight_add,
  3676. CASE
  3677. WHEN a.weight_after IS NULL or a.weight_after = 0 THEN '其他'
  3678. WHEN b.dry_weight IS NOT NULL THEN
  3679. CASE
  3680. WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
  3681. ELSE '不达标'
  3682. END
  3683. ELSE '其他'
  3684. END AS weight_status
  3685. `).
  3686. Joins("JOIN xt_patients p ON p.id = b.patient_id ").
  3687. Joins("left JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
  3688. Where("b.user_org_id = ?", user_org_id).
  3689. Where("b.assessment_date >= ?", start_time).
  3690. Where("b.assessment_date <= ?", end_time).
  3691. Where("b.status = ?", 1)
  3692. switch add_type {
  3693. case 1:
  3694. query = query.Where(`
  3695. (
  3696. CASE
  3697. WHEN b.dry_weight and b.weight_before IS NOT NULL
  3698. THEN (b.weight_before -b.dry_weight) / b.dry_weight
  3699. ELSE NULL
  3700. END
  3701. ) <= 0.03
  3702. `)
  3703. case 2:
  3704. query = query.Where(`
  3705. (
  3706. CASE
  3707. WHEN b.dry_weight and b.weight_before IS NOT NULL
  3708. THEN (b.weight_before -b.dry_weight) / b.dry_weight
  3709. ELSE NULL
  3710. END
  3711. ) > 0.03 AND (
  3712. CASE
  3713. WHEN b.dry_weight and b.weight_before IS NOT NULL
  3714. THEN (b.weight_before -b.dry_weight) / b.dry_weight
  3715. ELSE NULL
  3716. END
  3717. ) < 0.05
  3718. `)
  3719. case 3:
  3720. query = query.Where(`
  3721. (
  3722. CASE
  3723. WHEN b.dry_weight and b.weight_before IS NOT NULL
  3724. THEN (b.weight_before -b.dry_weight) / b.dry_weight
  3725. ELSE NULL
  3726. END
  3727. ) >= 0.05
  3728. `)
  3729. case 4:
  3730. query = query.Where(`
  3731. (
  3732. b.dry_weight
  3733. ) IS NULL or (
  3734. b.weight_before
  3735. ) IS NULL
  3736. `)
  3737. }
  3738. //// 获取总记录数
  3739. if err := query.Count(&total).Error; err != nil {
  3740. return nil, 0, fmt.Errorf("count query failed: %v", err)
  3741. }
  3742. var data []DialysisDataTwo
  3743. query.Order("p.id, b.assessment_date").Find(&data)
  3744. return data, total, nil
  3745. }