statistis_qc_service.go 37KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  1. package service
  2. import (
  3. "XT_New/models"
  4. "database/sql"
  5. "fmt"
  6. "github.com/jinzhu/gorm"
  7. "reflect"
  8. "strings"
  9. "time"
  10. )
  11. func GetDialysisTotalDatas() {
  12. }
  13. func GetNewDialysiTotal(startime int64, endtime int64, orgid int64, origin int64) (int64, error) {
  14. counts := models.PatientPrescriptionCountStruct{}
  15. var err error
  16. if origin == 1 { //透析记录,上机为准
  17. 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")
  18. 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", startime, endtime, orgid).Scan(&counts).Error
  19. return counts.Count, err
  20. } else {
  21. var count int64
  22. var schs []models.Schedule
  23. db := XTReadDB().Model(&models.Schedule{})
  24. err := db.
  25. Group("patient_id, schedule_date").
  26. Where("schedule_date >= ? AND schedule_date <= ? and user_org_id = ? and status = 1", startime, endtime, orgid).
  27. Find(&schs).
  28. Error
  29. count = int64(len(schs))
  30. return count, err
  31. }
  32. }
  33. type TreatmentMode struct {
  34. ModeID int `json:"mode_id"`
  35. ModeName string `json:"mode_name"`
  36. }
  37. type DialysisStat struct {
  38. Date string `json:"日期"`
  39. Counts map[string]int `json:"counts"`
  40. Total int `json:"合计"`
  41. }
  42. func GetTreatmentModes() ([]models.TreatmentMode, error) {
  43. var modes []models.TreatmentMode
  44. if err := XTReadDB().Model(&models.TreatmentMode{}).Find(&modes).Error; err != nil {
  45. return nil, err
  46. }
  47. return modes, nil
  48. }
  49. func GetDialysisStats(start int64, end int64, mode int64, org_id int64, time_way int64) ([]map[string]interface{}, error) {
  50. // 将时间戳转换为time.Time类型
  51. t := time.Unix(start, 0)
  52. // 使用布局定义格式化时间
  53. layout := "2006-01-02"
  54. // 将时间格式化为字符串
  55. startDate := t.Format(layout) + " 00:00:00"
  56. t2 := time.Unix(end, 0)
  57. // 使用布局定义格式化时间
  58. //layout := "2006-01-02"
  59. // 将时间格式化为字符串
  60. endDate := t2.Format(layout) + " 00:00:00"
  61. //var stats []DialysisStat
  62. var modes []models.TreatmentMode
  63. fmt.Println(mode)
  64. if mode == 0 {
  65. modes, _ = GetTreatmentModes()
  66. } else {
  67. modes_two, _ := GetTreatmentModes()
  68. for _, item := range modes_two {
  69. if item.ModeID == mode {
  70. modes = append(modes, item)
  71. }
  72. }
  73. }
  74. // 获取透析模式
  75. if err != nil {
  76. return nil, err
  77. }
  78. var selectClauses []string
  79. // 构建动态查询语句
  80. if time_way == 1 {
  81. //selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0])}
  82. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  83. } else if time_way == 3 {
  84. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  85. //selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0]+"-"+strings.Split(strings.Split(startDate, " ")[0], "-")[1])}
  86. } else if time_way == 4 {
  87. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  88. //selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0])}
  89. } else {
  90. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  91. }
  92. for _, mode := range modes {
  93. fmt.Println(mode)
  94. selectClauses = append(selectClauses, fmt.Sprintf("COALESCE(SUM(CASE WHEN t.name = '%s' THEN 1 ELSE 0 END), 0) AS `%s`", mode.Name, mode.Name))
  95. }
  96. selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
  97. var rows *sql.Rows
  98. var query string
  99. if mode > 0 {
  100. query = fmt.Sprintf(`
  101. SELECT
  102. %s
  103. FROM
  104. xt_dialysis_prescription p
  105. JOIN
  106. xt_treatment_mode t ON p.mode_id = t.mode_id
  107. WHERE
  108. FROM_UNIXTIME(p.record_date) >= ? AND FROM_UNIXTIME(p.record_date) <= ? AND p.user_org_id = ? and p.mode_id = ?
  109. GROUP BY
  110. 日期
  111. `, strings.Join(selectClauses, ", "))
  112. rows, _ = readDb.Raw(query, startDate, endDate, org_id, mode).Rows()
  113. } else {
  114. query = fmt.Sprintf(`
  115. SELECT
  116. %s
  117. FROM
  118. xt_dialysis_prescription p
  119. JOIN
  120. xt_treatment_mode t ON p.mode_id = t.mode_id
  121. WHERE
  122. FROM_UNIXTIME(p.record_date) >= ? AND FROM_UNIXTIME(p.record_date) <= ? AND p.user_org_id = ?
  123. GROUP BY
  124. 日期
  125. `, strings.Join(selectClauses, ", "))
  126. rows, _ = readDb.Raw(query, startDate, endDate, org_id).Rows()
  127. }
  128. if err != nil {
  129. return nil, err
  130. }
  131. defer rows.Close()
  132. columns, err := rows.Columns()
  133. if err != nil {
  134. return nil, err
  135. }
  136. var results []map[string]interface{}
  137. for rows.Next() {
  138. // 创建一个长度为列数的切片,用于存储每一行的值
  139. columnValues := make([]interface{}, len(columns))
  140. columnPointers := make([]interface{}, len(columns))
  141. for i := range columnValues {
  142. columnPointers[i] = &columnValues[i]
  143. }
  144. // 扫描当前行的值
  145. if err := rows.Scan(columnPointers...); err != nil {
  146. return nil, err
  147. }
  148. // 将扫描到的值放入结果 map 中
  149. result := make(map[string]interface{})
  150. for i, colName := range columns {
  151. val := columnPointers[i].(*interface{})
  152. result[colName] = *val
  153. }
  154. results = append(results, result)
  155. }
  156. //// 解析查询结果
  157. //for rows.Next() {
  158. // var stat DialysisStat
  159. // stat.Counts = make(map[string]int)
  160. // cols := []interface{}{&stat.Date}
  161. // for _, mode := range modes {
  162. // var count int
  163. // cols = append(cols, &count)
  164. // stat.Counts[mode.Name] = count
  165. // }
  166. // var total int
  167. // cols = append(cols, &total)
  168. // stat.Total = total
  169. // if err := rows.Scan(cols...); err != nil {
  170. // return nil, err
  171. // }
  172. // stats = append(stats, stat)
  173. //}
  174. return results, nil
  175. }
  176. func GetScheduleStats(start int64, end int64, mode int64, org_id int64, time_way int64) ([]map[string]interface{}, error) {
  177. // 将时间戳转换为time.Time类型
  178. t := time.Unix(start, 0)
  179. // 使用布局定义格式化时间
  180. layout := "2006-01-02"
  181. // 将时间格式化为字符串
  182. startDate := t.Format(layout) + " 00:00:00"
  183. t2 := time.Unix(end, 0)
  184. // 使用布局定义格式化时间
  185. //layout := "2006-01-02"
  186. // 将时间格式化为字符串
  187. endDate := t2.Format(layout) + " 00:00:00"
  188. //var stats []DialysisStat
  189. var modes []models.TreatmentMode
  190. fmt.Println(mode)
  191. if mode == 0 {
  192. modes, _ = GetTreatmentModes()
  193. } else {
  194. modes_two, _ := GetTreatmentModes()
  195. for _, item := range modes_two {
  196. if item.ModeID == mode {
  197. modes = append(modes, item)
  198. }
  199. }
  200. }
  201. // 获取透析模式
  202. if err != nil {
  203. return nil, err
  204. }
  205. var selectClauses []string
  206. // 构建动态查询语句
  207. if time_way == 1 {
  208. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0])}
  209. } else if time_way == 3 {
  210. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0]+strings.Split(strings.Split(startDate, " ")[0], "-")[1])}
  211. } else if time_way == 4 {
  212. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0])}
  213. } else {
  214. selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
  215. }
  216. for _, mode := range modes {
  217. fmt.Println(mode)
  218. selectClauses = append(selectClauses, fmt.Sprintf("COALESCE(SUM(CASE WHEN t.name = '%s' THEN 1 ELSE 0 END), 0) AS `%s`", mode.Name, mode.Name))
  219. }
  220. selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
  221. var rows *sql.Rows
  222. var query string
  223. if mode > 0 {
  224. query = fmt.Sprintf(`
  225. SELECT
  226. %s
  227. FROM
  228. xt_schedule p
  229. JOIN
  230. xt_treatment_mode t ON p.mode_id = t.mode_id
  231. WHERE
  232. FROM_UNIXTIME(p.schedule_date) >= ? AND FROM_UNIXTIME(p.schedule_date) <= ? AND p.user_org_id = ? and p.mode_id = ?
  233. GROUP BY
  234. 日期
  235. `, strings.Join(selectClauses, ", "))
  236. rows, _ = readDb.Raw(query, startDate, endDate, org_id, mode).Rows()
  237. } else {
  238. query = fmt.Sprintf(`
  239. SELECT
  240. %s
  241. FROM
  242. xt_schedule p
  243. JOIN
  244. xt_treatment_mode t ON p.mode_id = t.mode_id
  245. WHERE
  246. FROM_UNIXTIME(p.schedule_date) >= ? AND FROM_UNIXTIME(p.schedule_date) <= ? AND p.user_org_id = ?
  247. GROUP BY
  248. 日期
  249. `, strings.Join(selectClauses, ", "))
  250. rows, _ = readDb.Raw(query, startDate, endDate, org_id).Rows()
  251. }
  252. if err != nil {
  253. return nil, err
  254. }
  255. defer rows.Close()
  256. columns, err := rows.Columns()
  257. if err != nil {
  258. return nil, err
  259. }
  260. var results []map[string]interface{}
  261. for rows.Next() {
  262. // 创建一个长度为列数的切片,用于存储每一行的值
  263. columnValues := make([]interface{}, len(columns))
  264. columnPointers := make([]interface{}, len(columns))
  265. for i := range columnValues {
  266. columnPointers[i] = &columnValues[i]
  267. }
  268. // 扫描当前行的值
  269. if err := rows.Scan(columnPointers...); err != nil {
  270. return nil, err
  271. }
  272. // 将扫描到的值放入结果 map 中
  273. result := make(map[string]interface{})
  274. for i, colName := range columns {
  275. val := columnPointers[i].(*interface{})
  276. result[colName] = *val
  277. }
  278. results = append(results, result)
  279. }
  280. //// 解析查询结果
  281. //for rows.Next() {
  282. // var stat DialysisStat
  283. // stat.Counts = make(map[string]int)
  284. // cols := []interface{}{&stat.Date}
  285. // for _, mode := range modes {
  286. // var count int
  287. // cols = append(cols, &count)
  288. // stat.Counts[mode.Name] = count
  289. // }
  290. // var total int
  291. // cols = append(cols, &total)
  292. // stat.Total = total
  293. // if err := rows.Scan(cols...); err != nil {
  294. // return nil, err
  295. // }
  296. // stats = append(stats, stat)
  297. //}
  298. return results, nil
  299. }
  300. //func GetScheduleStats(startDate int64, endDate int64, groupBy int64, mode int64, org_id int64) ([]DialysisStat, error) {
  301. // var stats []DialysisStat
  302. // var modes []models.TreatmentMode
  303. // if mode > 0 {
  304. // modes, _ = GetTreatmentModes()
  305. // } else {
  306. // modes_two, _ := GetTreatmentModes()
  307. // for _, item := range modes_two {
  308. // if item.ModeID == mode {
  309. // modes = append(modes, item)
  310. // }
  311. // }
  312. // }
  313. // // 获取透析模式
  314. // if err != nil {
  315. // return nil, err
  316. // }
  317. //
  318. // // 构建日期格式
  319. // dateFormat := "%Y-%m-%d"
  320. // switch groupBy {
  321. // case 2:
  322. // dateFormat = "%Y-%m-%d"
  323. // case 1:
  324. // dateFormat = "%Y-%u"
  325. // case 3:
  326. // dateFormat = "%Y-%m"
  327. // case 4:
  328. // dateFormat = "%Y"
  329. // default:
  330. // return nil, fmt.Errorf("invalid group by option")
  331. // }
  332. // // 构建动态查询语句
  333. // selectClauses := []string{fmt.Sprintf("DATE_FORMAT(p.schudle_date, '%s') AS `日期`", dateFormat)}
  334. // for _, mode := range modes {
  335. // selectClauses = append(selectClauses, fmt.Sprintf("SUM(CASE WHEN t.mode_name = '%s' THEN 1 ELSE 0 END) AS `%s`", mode.Name, mode.Name))
  336. // }
  337. // selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
  338. //
  339. // query := fmt.Sprintf(`
  340. // SELECT
  341. // %s
  342. // FROM
  343. // xt_schedule p
  344. // JOIN
  345. // xt_treatment_mode t ON p.mode_id = t.mode_id
  346. // WHERE
  347. // p.schedule_date >= ? AND p.schedule_date <= ?
  348. // GROUP BY
  349. // DATE_FORMAT(p.schedule_date, '%s')
  350. // `, dateFormat, dateFormat, selectClauses)
  351. //
  352. // rows, err := readDb.Raw(query, startDate, endDate).Rows()
  353. // if err != nil {
  354. // return nil, err
  355. // }
  356. // defer rows.Close()
  357. //
  358. // // 解析查询结果
  359. // for rows.Next() {
  360. // var stat DialysisStat
  361. // stat.Counts = make(map[string]int)
  362. // cols := []interface{}{&stat.Date}
  363. // for _, mode := range modes {
  364. // var count int
  365. // cols = append(cols, &count)
  366. // stat.Counts[mode.Name] = count
  367. // }
  368. // var total int
  369. // cols = append(cols, &total)
  370. // stat.Total = total
  371. // if err := rows.Scan(cols...); err != nil {
  372. // return nil, err
  373. // }
  374. // stats = append(stats, stat)
  375. // }
  376. //
  377. // return stats, nil
  378. //}
  379. func GetNewDialysisCountMode(starttime int64, endtime int64, orgid int64, origin int64, mode_id int64) (counts []*models.PatientPrescriptionCountStruct, err error) {
  380. if origin == 1 {
  381. db := readDb.Table("xt_dialysis_order as o").Where("o.status = 1")
  382. if starttime > 0 {
  383. db = db.Where("o.dialysis_date >=?", starttime)
  384. }
  385. if endtime > 0 {
  386. db = db.Where("o.dialysis_date<=?", endtime)
  387. }
  388. if orgid > 0 {
  389. db = db.Where("o.user_org_id = ?", orgid)
  390. }
  391. if mode_id == 0 {
  392. 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
  393. } else {
  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 = ? ", starttime, endtime, mode_id).Group("s.mode_id").Scan(&counts).Error
  395. }
  396. return counts, err
  397. } else {
  398. 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
  399. return counts, err
  400. }
  401. }
  402. func GetNewDialysisCountModeTwo(starttime int64, endtime int64, orgid int64, origin int64, mode_id int64) (counts models.CustomDialysisData, err error) {
  403. // 将时间戳转换为time.Time类型
  404. t := time.Unix(starttime, 0)
  405. // 使用布局定义格式化时间
  406. layout := "2006-01-02"
  407. // 将时间格式化为字符串
  408. startDate := t.Format(layout) + " 00:00:00"
  409. t2 := time.Unix(endtime, 0)
  410. // 使用布局定义格式化时间
  411. //layout := "2006-01-02"
  412. // 将时间格式化为字符串
  413. endDate := t2.Format(layout) + " 00:00:00"
  414. //fmt.Println(formattedDate)
  415. // 将日期字符串解析为time.Time类型
  416. //start, _ := time.Parse("2006-01-02 15:04:05", formattedDate)
  417. //starttime = start.Unix()
  418. //fmt.Println(starttime)
  419. if origin == 1 {
  420. db := readDb.Table("xt_dialysis_order as o").Where("o.status = 1")
  421. if starttime > 0 {
  422. db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.dialysis_date), '%Y-%m-%d %H:%i:%s') >= ?", startDate)
  423. }
  424. if endtime > 0 {
  425. db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.dialysis_date), '%Y-%m-%d %H:%i:%s') <= ?", endDate)
  426. }
  427. if orgid > 0 {
  428. db = db.Where("o.user_org_id = ?", orgid)
  429. }
  430. 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
  431. return counts, err
  432. } else {
  433. db := readDb.Table("xt_schedule as o").Where("o.status = 1").Select("patient_id, schedule_date").Group("mode_id")
  434. if starttime > 0 {
  435. db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.schedule_date),'%Y-%m-%d %H:%i:%s') >= ?", startDate)
  436. }
  437. if endtime > 0 {
  438. db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.schedule_date),'%Y-%m-%d %H:%i:%s') <= ?", endDate)
  439. }
  440. if orgid > 0 {
  441. db = db.Where("o.user_org_id = ?", orgid)
  442. }
  443. if mode_id > 0 {
  444. db = db.Where("o.mode_id = ?", mode_id)
  445. }
  446. err = db.Select("o.mode_id,count(o.mode_id) as count").Scan(&counts).Error
  447. return counts, err
  448. }
  449. }
  450. var anticoagulantMap = map[int]string{
  451. 1: "无肝素",
  452. 2: "普通肝素",
  453. 3: "低分子肝素",
  454. 4: "阿加曲班",
  455. 5: "枸橼酸钠",
  456. 6: "低分子肝素钙",
  457. 7: "低分子肝素钠",
  458. 8: "依诺肝素",
  459. 9: "达肝素",
  460. 10: "体外抗凝",
  461. 11: "那屈肝素",
  462. 12: "无抗凝剂",
  463. 13: "那屈肝素钙",
  464. 14: "肝素钙注射液",
  465. 15: "甲磺酸萘莫司他",
  466. 16: "低分子量肝素钙",
  467. 17: "肝素钠",
  468. }
  469. func GetAnticoagulantData(start_time int64, end_time int64, org_id int64) (map[string]int, error) {
  470. var results []struct {
  471. Anticoagulant int
  472. Count int
  473. }
  474. err := XTReadDB().Model(&models.DialysisPrescription{}).
  475. Select("anticoagulant, COUNT(*) as count").
  476. Where("status = 1 and record_date >= ? and record_date <= ? and user_org_id = ?", start_time, end_time, org_id).
  477. Group("anticoagulant").
  478. Scan(&results).Error
  479. if err != nil {
  480. return nil, err
  481. }
  482. anticoagulantData := make(map[string]int)
  483. for _, result := range results {
  484. if name, ok := anticoagulantMap[result.Anticoagulant]; ok {
  485. anticoagulantData[name] = result.Count
  486. } else {
  487. anticoagulantData[fmt.Sprintf("Unknown (%d)", result.Anticoagulant)] = result.Count
  488. }
  489. }
  490. return anticoagulantData, nil
  491. }
  492. func GetAnticoagulantTotal(start_time int64, end_time int64, org_id int64) (total int64, err error) {
  493. err = XTReadDB().Model(&models.DialysisPrescription{}).
  494. Where("record_date >= ? and record_date <= ? and user_org_id = ? and status = 1", start_time, end_time, org_id).
  495. Count(&total).Error
  496. return
  497. }
  498. func GetDialyzerSummary(org_id int64) ([]string, error) {
  499. var Dialyzer []string
  500. err := XTReadDB().Model(&models.DialysisPrescription{}).
  501. Select("dialysis_dialyszers").
  502. Where(" user_org_id = ? and status = 1", org_id).
  503. Group("dialysis_dialyszers").
  504. Scan(&Dialyzer).Error
  505. if err != nil {
  506. return nil, err
  507. }
  508. return Dialyzer, nil
  509. }
  510. func GetIrrigationSummary(org_id int64) ([]string, error) {
  511. var Irrigation []string
  512. err := XTReadDB().Model(&models.DialysisPrescription{}).
  513. Select("dialysis_irrigation").
  514. Where(" user_org_id = ? and status = 1", org_id).
  515. Group("dialysis_irrigation").
  516. Scan(&Irrigation).Error
  517. if err != nil {
  518. return nil, err
  519. }
  520. return Irrigation, nil
  521. }
  522. type DialyzerResult struct {
  523. Dialyzer string
  524. Count int
  525. }
  526. func GetDialyzerData(start_time int64, end_time int64, org_id int64) (dr []DialyzerResult, err error) {
  527. err = XTReadDB().Model(&models.DialysisPrescription{}).
  528. Select("dialysis_dialyszers as dialyzer, COUNT(*) as count").
  529. Where("record_date >= ? and record_date <= ? and user_org_id = ? and status = 1", start_time, end_time, org_id).
  530. Group("dialysis_dialyszers").
  531. Scan(&dr).Error
  532. return
  533. }
  534. func GetDialyzerTotal(start_time int64, end_time int64, org_id int64) (total int64, err error) {
  535. err = XTReadDB().Model(&models.DialysisPrescription{}).
  536. Where("status = 1 and record_date >= ? and record_date <= ? and user_org_id = ? and dialysis_dialyszers <> ''", start_time, end_time, org_id).
  537. Count(&total).Error
  538. return
  539. }
  540. func GetPrescriptionByAnticoagulant(page int64, limit int64, orgid int64, anticoagulant int64, start_time int64, end_time int64) (solution []*models.DialysisPrescription, total int64, err error) {
  541. db := XTReadDB().Model(&models.DialysisPrescription{}).Where("status = 1")
  542. if anticoagulant > 0 {
  543. db = db.Where("anticoagulant = ?", anticoagulant)
  544. }
  545. if orgid > 0 {
  546. db = db.Where("user_org_id = ?", orgid)
  547. }
  548. db = db.Where("record_date >= ? and record_date <= ?", start_time, end_time)
  549. offset := (page - 1) * limit
  550. err = db.Count(&total).Offset(offset).Limit(limit).Find(&solution).Error
  551. return solution, total, err
  552. }
  553. func GetPrescriptionByDialyzer(page int64, limit int64, orgid int64, dialyzer string, start_time int64, end_time int64) (solution []*models.DialysisPrescription, total int64, err error) {
  554. db := XTReadDB().Model(&models.DialysisPrescription{}).Where("status = 1")
  555. if len(dialyzer) > 0 {
  556. db = db.Where("dialysis_dialyszers = ?", dialyzer)
  557. }
  558. if orgid > 0 {
  559. db = db.Where("user_org_id = ?", orgid)
  560. }
  561. db = db.Where("record_date >= ? and record_date <= ?", start_time, end_time)
  562. offset := (page - 1) * limit
  563. err = db.Count(&total).Offset(offset).Limit(limit).Find(&solution).Error
  564. return solution, total, err
  565. }
  566. type DialysisData struct {
  567. DialysisStatus string `json:"dialysis_status"`
  568. Count int `json:"count"`
  569. }
  570. type CustomData struct {
  571. DialysisNo string
  572. PatientName string
  573. DialysisDate string
  574. DialysisDuration string
  575. ActualDuration string
  576. Diff string
  577. Doctor string
  578. Nurse string
  579. }
  580. func GetDialysisCompletionRate(org_id int64, start_time int64, end_time int64) (map[string]int, error) {
  581. var results []DialysisData
  582. query := `
  583. SELECT
  584. CASE
  585. 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 '达标'
  586. WHEN TIMESTAMPDIFF(MINUTE, MAKETIME(p.dialysis_duration_hour, p.dialysis_duration_minute, 0), MAKETIME(a.actual_treatment_hour, a.actual_treatment_minute, 0)) < 0 THEN '未达标'
  587. ELSE '超时'
  588. END AS dialysis_status,
  589. COUNT(*) AS count
  590. FROM
  591. xt_dialysis_order o
  592. JOIN
  593. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  594. JOIN
  595. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  596. WHERE
  597. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  598. GROUP BY
  599. dialysis_status;
  600. `
  601. if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Scan(&results).Error; err != nil {
  602. return nil, err
  603. }
  604. dialysisCompletionRate := make(map[string]int)
  605. for _, result := range results {
  606. dialysisCompletionRate[result.DialysisStatus] = result.Count
  607. }
  608. return dialysisCompletionRate, nil
  609. }
  610. func GetDialysisCompletionTotal(org_id int64, start_time int64, end_time int64) (int64, error) {
  611. var Count int64
  612. query := `
  613. SELECT
  614. COUNT(*) AS count
  615. FROM
  616. xt_dialysis_order o
  617. JOIN
  618. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  619. JOIN
  620. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  621. WHERE
  622. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  623. `
  624. if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Count(&Count).Error; err != nil {
  625. return 0, err
  626. }
  627. return Count, nil
  628. }
  629. func GetDialysisCompletionDetail(org_id int64, start_time int64, end_time int64, mode int64, limit int64, page int64) (results []interface{}, total int64, err error) {
  630. var query string
  631. if mode == 0 {
  632. query = `
  633. SELECT
  634. p.dialysis_no as dialysis_no,
  635. p.name as patient_name,
  636. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  637. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  638. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  639. 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,
  640. p.prescription_doctor as doctor,
  641. o.finish_nurse as nurse
  642. FROM
  643. xt_dialysis_order o
  644. JOIN
  645. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  646. JOIN
  647. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  648. JOIN
  649. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  650. WHERE
  651. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  652. `
  653. readDb.Table("xt_dialysis_order o").
  654. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  655. 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).
  656. 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).
  657. 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)
  658. } else if mode == 1 {
  659. query = `
  660. SELECT
  661. pp.dialysis_no as dialysis_no,
  662. pp.name as patient_name,
  663. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  664. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  665. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  666. 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,
  667. p.prescription_doctor as doctor,
  668. o.finish_nurse as nurse
  669. FROM
  670. xt_dialysis_order o
  671. JOIN
  672. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  673. JOIN
  674. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  675. JOIN
  676. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  677. WHERE
  678. 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
  679. `
  680. readDb.Table("xt_dialysis_order o").
  681. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  682. 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).
  683. 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).
  684. 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)
  685. } else if mode == 2 {
  686. query = `
  687. SELECT
  688. pp.dialysis_no as dialysis_no,
  689. pp.name as patient_name,
  690. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  691. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  692. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  693. 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,
  694. p.prescription_doctor as doctor,
  695. o.finish_nurse as nurse
  696. FROM
  697. xt_dialysis_order o
  698. JOIN
  699. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  700. JOIN
  701. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  702. JOIN
  703. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  704. WHERE
  705. 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
  706. `
  707. readDb.Table("xt_dialysis_order o").
  708. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  709. 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).
  710. 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).
  711. 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)
  712. } else if mode == 3 {
  713. query = `
  714. SELECT
  715. pp.dialysis_no as dialysis_no,
  716. pp.name as patient_name,
  717. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  718. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  719. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  720. 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,
  721. p.prescription_doctor as doctor,
  722. o.finish_nurse as nurse
  723. FROM
  724. xt_dialysis_order o
  725. JOIN
  726. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  727. JOIN
  728. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  729. JOIN
  730. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  731. WHERE
  732. 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
  733. `
  734. readDb.Table("xt_dialysis_order o").
  735. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  736. 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).
  737. 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).
  738. 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)
  739. }
  740. offset := (page - 1) * limit
  741. rows, err := readDb.Raw(query, org_id, org_id, org_id, org_id, start_time, end_time).Offset(offset).Limit(limit).Rows()
  742. if err != nil {
  743. fmt.Println(err)
  744. }
  745. defer rows.Close()
  746. // Define a map to hold the dynamic fields
  747. fields := map[string]interface{}{
  748. "dialysis_no": "",
  749. "patient_name": "",
  750. "dialysis_date": "",
  751. "dialysis_duration": "",
  752. "actual_duration": "",
  753. "diff": 0,
  754. "doctor": "",
  755. "nurse": "",
  756. }
  757. // Create the dynamic struct type
  758. dynamicStructType := createDynamicStruct(fields)
  759. // Slice to hold the results
  760. //var results []interface{}
  761. // Iterate over the rows and scan into the dynamic struct
  762. for rows.Next() {
  763. // Create a new instance of the dynamic struct
  764. result := reflect.New(dynamicStructType).Interface()
  765. // Create a slice of pointers to the fields in the struct
  766. fieldPtrs := []interface{}{
  767. reflect.ValueOf(result).Elem().FieldByName("Dialysis_no").Addr().Interface(),
  768. reflect.ValueOf(result).Elem().FieldByName("Patient_name").Addr().Interface(),
  769. reflect.ValueOf(result).Elem().FieldByName("Dialysis_date").Addr().Interface(),
  770. reflect.ValueOf(result).Elem().FieldByName("Dialysis_duration").Addr().Interface(),
  771. reflect.ValueOf(result).Elem().FieldByName("Actual_duration").Addr().Interface(),
  772. reflect.ValueOf(result).Elem().FieldByName("Diff").Addr().Interface(),
  773. reflect.ValueOf(result).Elem().FieldByName("Doctor").Addr().Interface(),
  774. reflect.ValueOf(result).Elem().FieldByName("Nurse").Addr().Interface(),
  775. }
  776. // Scan the row into the struct
  777. if err := rows.Scan(fieldPtrs...); err != nil {
  778. //log.Fatalf("failed to scan row: %v", err)
  779. fmt.Println(err)
  780. }
  781. // Append the result to the slice
  782. results = append(results, result)
  783. }
  784. return results, total, err
  785. }
  786. type QualityControlStandard struct {
  787. ItemName string `json:"item_name"`
  788. ProjectMame string `json:"project_name"`
  789. InspectionMajor int64 `json:"inspection_major"`
  790. InspectionMinor int64 `json:"inspection_minor"`
  791. }
  792. func getQualityControlStandards(org_id int64) ([]QualityControlStandard, error) {
  793. var standards []QualityControlStandard
  794. 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 {
  795. return nil, err
  796. }
  797. return standards, nil
  798. }
  799. type DialysisQualityStat struct {
  800. Month string `json:"月"`
  801. Name string `json:"姓名"`
  802. Counts map[string]float64 `json:"counts"`
  803. }
  804. func GetLatestInspectionValues(org_id int64, yearMonth string) ([]map[string]interface{}, error) {
  805. standards, err := getQualityControlStandards(org_id)
  806. if err != nil {
  807. return nil, err
  808. }
  809. var selectFields []string
  810. for _, standard := range standards {
  811. field := fmt.Sprintf("IFNULL(MAX(CASE WHEN i.item_name = %s THEN i.inspect_value END),'') AS `%s`",
  812. "'"+standard.ItemName+"'", standard.ItemName)
  813. selectFields = append(selectFields, field)
  814. }
  815. query := fmt.Sprintf(`
  816. SELECT
  817. p.name as '姓名',
  818. %s
  819. FROM xt_inspection i
  820. JOIN xt_patients p On p.id = i.patient_id
  821. WHERE DATE_FORMAT(FROM_UNIXTIME(i.inspect_date), '%%Y-%%m') = ? and org_id = ?
  822. GROUP BY i.patient_id
  823. `, strings.Join(selectFields, ", "))
  824. var results []map[string]interface{}
  825. rows, err := readDb.Raw(query, yearMonth, org_id).Rows()
  826. if err != nil {
  827. return nil, err
  828. }
  829. defer rows.Close()
  830. columns, err := rows.Columns()
  831. if err != nil {
  832. return nil, err
  833. }
  834. for rows.Next() {
  835. // 创建一个长度为列数的切片,用于存储每一行的值
  836. columnValues := make([]interface{}, len(columns))
  837. columnPointers := make([]interface{}, len(columns))
  838. for i := range columnValues {
  839. columnPointers[i] = &columnValues[i]
  840. }
  841. // 扫描当前行的值
  842. if err := rows.Scan(columnPointers...); err != nil {
  843. return nil, err
  844. }
  845. // 将扫描到的值放入结果 map 中
  846. result := make(map[string]interface{})
  847. for i, colName := range columns {
  848. val := columnPointers[i].(*interface{})
  849. result[colName] = *val
  850. }
  851. results = append(results, result)
  852. }
  853. return results, nil
  854. }
  855. func createDynamicStruct(fields map[string]interface{}) reflect.Type {
  856. var structFields []reflect.StructField
  857. for name, value := range fields {
  858. structFields = append(structFields, reflect.StructField{
  859. Name: strings.Title(name),
  860. Type: reflect.TypeOf(value),
  861. Tag: reflect.StructTag(fmt.Sprintf(`json:"%s"`, name)),
  862. })
  863. }
  864. return reflect.StructOf(structFields)
  865. }
  866. func GetDialysisPrescriptionInfo(start_date string, end_date string, mode int64, org_id int64, page int64, limit int64) (qcp []models.QCPrescription, total int64, err error) {
  867. offset := (page - 1) * limit
  868. err = readDb.Model(&models.QCPrescription{}).Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  869. return readUserDb.Where("status = 1 and org_id=?", org_id)
  870. }).Preload("QCPatients", "status = 1 and user_org_id = ?", org_id).Preload("QCDialysisOrder", func(db *gorm.DB) *gorm.DB {
  871. return db.Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  872. return readUserDb.Where("status = 1 and org_id=?", org_id)
  873. }).Preload("DeviceNumber", "status = 1 and org_id = ?", org_id).Where("status = 1 AND user_org_id = ?", org_id)
  874. }).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
  875. return
  876. }
  877. func GetScheduleInfo(start_date string, end_date string, mode int64, org_id int64, page int64, limit int64) (qcp []models.QCSchedule, total int64, err error) {
  878. offset := (page - 1) * limit
  879. err = readDb.Model(&models.QCSchedule{}).Preload("QCPatients", "status = 1 and user_org_id =?", org_id).Preload("QCSPrescription", func(db *gorm.DB) *gorm.DB {
  880. return db.Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  881. return readUserDb.Where("status = 1 and org_id=?", org_id)
  882. }).Where("status = 1 AND user_org_id = ?", org_id)
  883. }).Preload("QCAssessmentAfterDislysis", "status = 1 and user_org_id = ?", org_id).Preload("QCDialysisOrder", func(db *gorm.DB) *gorm.DB {
  884. return db.Preload("DeviceNumber", "status = 1").Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  885. return readUserDb.Where("status = 1 and org_id=?", org_id)
  886. }).Where("status = 1 AND user_org_id = ?", org_id)
  887. }).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
  888. return
  889. }