statistis_qc_service.go 37KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  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. type DialyzerResult struct {
  511. Dialyzer string
  512. Count int
  513. }
  514. func GetDialyzerData(start_time int64, end_time int64, org_id int64) (dr []DialyzerResult, err error) {
  515. err = XTReadDB().Model(&models.DialysisPrescription{}).
  516. Select("dialysis_dialyszers as dialyzer, COUNT(*) as count").
  517. Where("record_date >= ? and record_date <= ? and user_org_id = ? and status = 1", start_time, end_time, org_id).
  518. Group("dialysis_dialyszers").
  519. Scan(&dr).Error
  520. return
  521. }
  522. func GetDialyzerTotal(start_time int64, end_time int64, org_id int64) (total int64, err error) {
  523. err = XTReadDB().Model(&models.DialysisPrescription{}).
  524. Where("status = 1 and record_date >= ? and record_date <= ? and user_org_id = ? and dialysis_dialyszers <> ''", start_time, end_time, org_id).
  525. Count(&total).Error
  526. return
  527. }
  528. func GetPrescriptionByAnticoagulant(page int64, limit int64, orgid int64, anticoagulant int64, start_time int64, end_time int64) (solution []*models.DialysisPrescription, total int64, err error) {
  529. db := XTReadDB().Model(&models.DialysisPrescription{}).Where("status = 1")
  530. if anticoagulant > 0 {
  531. db = db.Where("anticoagulant = ?", anticoagulant)
  532. }
  533. if orgid > 0 {
  534. db = db.Where("user_org_id = ?", orgid)
  535. }
  536. db = db.Where("record_date >= ? and record_date <= ?", start_time, end_time)
  537. offset := (page - 1) * limit
  538. err = db.Count(&total).Offset(offset).Limit(limit).Find(&solution).Error
  539. return solution, total, err
  540. }
  541. func GetPrescriptionByDialyzer(page int64, limit int64, orgid int64, dialyzer string, start_time int64, end_time int64) (solution []*models.DialysisPrescription, total int64, err error) {
  542. db := XTReadDB().Model(&models.DialysisPrescription{}).Where("status = 1")
  543. if len(dialyzer) > 0 {
  544. db = db.Where("dialysis_dialyszers = ?", dialyzer)
  545. }
  546. if orgid > 0 {
  547. db = db.Where("user_org_id = ?", orgid)
  548. }
  549. db = db.Where("record_date >= ? and record_date <= ?", start_time, end_time)
  550. offset := (page - 1) * limit
  551. err = db.Count(&total).Offset(offset).Limit(limit).Find(&solution).Error
  552. return solution, total, err
  553. }
  554. type DialysisData struct {
  555. DialysisStatus string `json:"dialysis_status"`
  556. Count int `json:"count"`
  557. }
  558. type CustomData struct {
  559. DialysisNo string
  560. PatientName string
  561. DialysisDate string
  562. DialysisDuration string
  563. ActualDuration string
  564. Diff string
  565. Doctor string
  566. Nurse string
  567. }
  568. func GetDialysisCompletionRate(org_id int64, start_time int64, end_time int64) (map[string]int, error) {
  569. var results []DialysisData
  570. query := `
  571. SELECT
  572. CASE
  573. 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 '达标'
  574. 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 '未达标'
  575. ELSE '超时'
  576. END AS dialysis_status,
  577. COUNT(*) AS count
  578. FROM
  579. xt_dialysis_order o
  580. JOIN
  581. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  582. JOIN
  583. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  584. WHERE
  585. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  586. GROUP BY
  587. dialysis_status;
  588. `
  589. if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Scan(&results).Error; err != nil {
  590. return nil, err
  591. }
  592. dialysisCompletionRate := make(map[string]int)
  593. for _, result := range results {
  594. dialysisCompletionRate[result.DialysisStatus] = result.Count
  595. }
  596. return dialysisCompletionRate, nil
  597. }
  598. func GetDialysisCompletionTotal(org_id int64, start_time int64, end_time int64) (int64, error) {
  599. var Count int64
  600. query := `
  601. SELECT
  602. COUNT(*) AS count
  603. FROM
  604. xt_dialysis_order o
  605. JOIN
  606. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  607. JOIN
  608. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  609. WHERE
  610. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  611. `
  612. if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Count(&Count).Error; err != nil {
  613. return 0, err
  614. }
  615. return Count, nil
  616. }
  617. func GetDialysisCompletionDetail(org_id int64, start_time int64, end_time int64, mode int64, limit int64, page int64) (results []interface{}, total int64, err error) {
  618. var query string
  619. if mode == 0 {
  620. query = `
  621. SELECT
  622. p.dialysis_no as dialysis_no,
  623. p.name as patient_name,
  624. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  625. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  626. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  627. 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,
  628. p.prescription_doctor as doctor,
  629. o.finish_nurse as nurse
  630. FROM
  631. xt_dialysis_order o
  632. JOIN
  633. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  634. JOIN
  635. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  636. JOIN
  637. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  638. WHERE
  639. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  640. `
  641. readDb.Table("xt_dialysis_order o").
  642. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  643. 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).
  644. 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).
  645. 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)
  646. } else if mode == 1 {
  647. query = `
  648. SELECT
  649. pp.dialysis_no as dialysis_no,
  650. pp.name as patient_name,
  651. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  652. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  653. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  654. 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,
  655. p.prescription_doctor as doctor,
  656. o.finish_nurse as nurse
  657. FROM
  658. xt_dialysis_order o
  659. JOIN
  660. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  661. JOIN
  662. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  663. JOIN
  664. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  665. WHERE
  666. 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
  667. `
  668. readDb.Table("xt_dialysis_order o").
  669. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  670. 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).
  671. 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).
  672. 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)
  673. } else if mode == 2 {
  674. query = `
  675. SELECT
  676. pp.dialysis_no as dialysis_no,
  677. pp.name as patient_name,
  678. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  679. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  680. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  681. 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,
  682. p.prescription_doctor as doctor,
  683. o.finish_nurse as nurse
  684. FROM
  685. xt_dialysis_order o
  686. JOIN
  687. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  688. JOIN
  689. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  690. JOIN
  691. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  692. WHERE
  693. 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
  694. `
  695. readDb.Table("xt_dialysis_order o").
  696. Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
  697. 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).
  698. 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).
  699. 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)
  700. } else if mode == 3 {
  701. query = `
  702. SELECT
  703. pp.dialysis_no as dialysis_no,
  704. pp.name as patient_name,
  705. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  706. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  707. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  708. 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,
  709. p.prescription_doctor as doctor,
  710. o.finish_nurse as nurse
  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 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 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. }
  728. offset := (page - 1) * limit
  729. rows, err := readDb.Raw(query, org_id, org_id, org_id, org_id, start_time, end_time).Offset(offset).Limit(limit).Rows()
  730. if err != nil {
  731. fmt.Println(err)
  732. }
  733. defer rows.Close()
  734. // Define a map to hold the dynamic fields
  735. fields := map[string]interface{}{
  736. "dialysis_no": "",
  737. "patient_name": "",
  738. "dialysis_date": "",
  739. "dialysis_duration": "",
  740. "actual_duration": "",
  741. "diff": 0,
  742. "doctor": "",
  743. "nurse": "",
  744. }
  745. // Create the dynamic struct type
  746. dynamicStructType := createDynamicStruct(fields)
  747. // Slice to hold the results
  748. //var results []interface{}
  749. // Iterate over the rows and scan into the dynamic struct
  750. for rows.Next() {
  751. // Create a new instance of the dynamic struct
  752. result := reflect.New(dynamicStructType).Interface()
  753. // Create a slice of pointers to the fields in the struct
  754. fieldPtrs := []interface{}{
  755. reflect.ValueOf(result).Elem().FieldByName("Dialysis_no").Addr().Interface(),
  756. reflect.ValueOf(result).Elem().FieldByName("Patient_name").Addr().Interface(),
  757. reflect.ValueOf(result).Elem().FieldByName("Dialysis_date").Addr().Interface(),
  758. reflect.ValueOf(result).Elem().FieldByName("Dialysis_duration").Addr().Interface(),
  759. reflect.ValueOf(result).Elem().FieldByName("Actual_duration").Addr().Interface(),
  760. reflect.ValueOf(result).Elem().FieldByName("Diff").Addr().Interface(),
  761. reflect.ValueOf(result).Elem().FieldByName("Doctor").Addr().Interface(),
  762. reflect.ValueOf(result).Elem().FieldByName("Nurse").Addr().Interface(),
  763. }
  764. // Scan the row into the struct
  765. if err := rows.Scan(fieldPtrs...); err != nil {
  766. //log.Fatalf("failed to scan row: %v", err)
  767. fmt.Println(err)
  768. }
  769. // Append the result to the slice
  770. results = append(results, result)
  771. }
  772. return results, total, err
  773. }
  774. type QualityControlStandard struct {
  775. ItemName string `json:"item_name"`
  776. ProjectMame string `json:"project_name"`
  777. InspectionMajor int64 `json:"inspection_major"`
  778. InspectionMinor int64 `json:"inspection_minor"`
  779. }
  780. func getQualityControlStandards(org_id int64) ([]QualityControlStandard, error) {
  781. var standards []QualityControlStandard
  782. 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 {
  783. return nil, err
  784. }
  785. return standards, nil
  786. }
  787. type DialysisQualityStat struct {
  788. Month string `json:"月"`
  789. Name string `json:"姓名"`
  790. Counts map[string]float64 `json:"counts"`
  791. }
  792. func GetLatestInspectionValues(org_id int64, yearMonth string) ([]map[string]interface{}, error) {
  793. standards, err := getQualityControlStandards(org_id)
  794. if err != nil {
  795. return nil, err
  796. }
  797. var selectFields []string
  798. for _, standard := range standards {
  799. field := fmt.Sprintf("IFNULL(MAX(CASE WHEN i.item_name = %s THEN i.inspect_value END),'') AS `%s`",
  800. "'"+standard.ItemName+"'", standard.ItemName)
  801. selectFields = append(selectFields, field)
  802. }
  803. query := fmt.Sprintf(`
  804. SELECT
  805. p.name as '姓名',
  806. %s
  807. FROM xt_inspection i
  808. JOIN xt_patients p On p.id = i.patient_id
  809. WHERE DATE_FORMAT(FROM_UNIXTIME(i.inspect_date), '%%Y-%%m') = ? and org_id = ?
  810. GROUP BY i.patient_id
  811. `, strings.Join(selectFields, ", "))
  812. var results []map[string]interface{}
  813. rows, err := readDb.Raw(query, yearMonth, org_id).Rows()
  814. if err != nil {
  815. return nil, err
  816. }
  817. defer rows.Close()
  818. columns, err := rows.Columns()
  819. if err != nil {
  820. return nil, err
  821. }
  822. for rows.Next() {
  823. // 创建一个长度为列数的切片,用于存储每一行的值
  824. columnValues := make([]interface{}, len(columns))
  825. columnPointers := make([]interface{}, len(columns))
  826. for i := range columnValues {
  827. columnPointers[i] = &columnValues[i]
  828. }
  829. // 扫描当前行的值
  830. if err := rows.Scan(columnPointers...); err != nil {
  831. return nil, err
  832. }
  833. // 将扫描到的值放入结果 map 中
  834. result := make(map[string]interface{})
  835. for i, colName := range columns {
  836. val := columnPointers[i].(*interface{})
  837. result[colName] = *val
  838. }
  839. results = append(results, result)
  840. }
  841. return results, nil
  842. }
  843. func createDynamicStruct(fields map[string]interface{}) reflect.Type {
  844. var structFields []reflect.StructField
  845. for name, value := range fields {
  846. structFields = append(structFields, reflect.StructField{
  847. Name: strings.Title(name),
  848. Type: reflect.TypeOf(value),
  849. Tag: reflect.StructTag(fmt.Sprintf(`json:"%s"`, name)),
  850. })
  851. }
  852. return reflect.StructOf(structFields)
  853. }
  854. func GetDialysisPrescriptionInfo(start_date string, end_date string, mode int64, org_id int64, page int64, limit int64) (qcp []models.QCPrescription, total int64, err error) {
  855. offset := (page - 1) * limit
  856. err = readDb.Model(&models.QCPrescription{}).Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  857. return readUserDb.Where("status = 1 and org_id=?", org_id)
  858. }).Preload("QCPatients", "status = 1 and user_org_id = ?", org_id).Preload("QCDialysisOrder", func(db *gorm.DB) *gorm.DB {
  859. return db.Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  860. return readUserDb.Where("status = 1 and org_id=?", org_id)
  861. }).Preload("DeviceNumber", "status = 1 and org_id = ?", org_id).Where("status = 1 AND user_org_id = ?", org_id)
  862. }).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
  863. return
  864. }
  865. func GetScheduleInfo(start_date string, end_date string, mode int64, org_id int64, page int64, limit int64) (qcp []models.QCSchedule, total int64, err error) {
  866. offset := (page - 1) * limit
  867. err = readDb.Model(&models.QCSchedule{}).Preload("QCPatients", "status = 1 and user_org_id =?", org_id).Preload("QCSPrescription", func(db *gorm.DB) *gorm.DB {
  868. return db.Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  869. return readUserDb.Where("status = 1 and org_id=?", org_id)
  870. }).Where("status = 1 AND user_org_id = ?", org_id)
  871. }).Preload("QCAssessmentAfterDislysis", "status = 1 and user_org_id = ?", org_id).Preload("QCDialysisOrder", func(db *gorm.DB) *gorm.DB {
  872. return db.Preload("DeviceNumber", "status = 1").Preload("UserAdminRole", func(db *gorm.DB) *gorm.DB {
  873. return readUserDb.Where("status = 1 and org_id=?", org_id)
  874. }).Where("status = 1 AND user_org_id = ?", org_id)
  875. }).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
  876. return
  877. }