statistis_qc_service.go 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. package service
  2. import (
  3. "XT_New/models"
  4. "fmt"
  5. "strings"
  6. )
  7. func GetDialysisTotalDatas() {
  8. }
  9. func GetNewDialysiTotal(startime int64, endtime int64, orgid int64, origin int64) (int64, error) {
  10. counts := models.PatientPrescriptionCountStruct{}
  11. var err error
  12. if origin == 1 { //透析记录,上机为准
  13. db := XTReadDB().Table("xt_dialysis_order as x")
  14. 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
  15. return counts.Count, err
  16. } else {
  17. db := XTReadDB().Table("xt_schedule as sch")
  18. //err = db.Select("COUNT(DISTINCT patient_id) AS total_employees").Where("x.dialysis_date >= ? and x.dialysis_date<=? and x.user_org_id = ? AND x.status = 1", startime, endtime, orgid).Scan(&counts).Error
  19. var count int64
  20. err := db.Model(&Schedule{}).
  21. Select("patient_id, schedule_date").
  22. Group("patient_id, schedule_date").
  23. Where("schedule_date >= ? AND schedule_date <= ?", startime, endtime).
  24. Count(&count).
  25. Error
  26. return count, err
  27. }
  28. }
  29. type TreatmentMode struct {
  30. ModeID int `json:"mode_id"`
  31. ModeName string `json:"mode_name"`
  32. }
  33. type DialysisStat struct {
  34. Date string `json:"日期"`
  35. Counts map[string]int `json:"counts"`
  36. Total int `json:"合计"`
  37. }
  38. func getTreatmentModes() ([]TreatmentMode, error) {
  39. var modes []TreatmentMode
  40. if err := XTReadDB().Find(&modes).Error; err != nil {
  41. return nil, err
  42. }
  43. return modes, nil
  44. }
  45. func GetDialysisStats(startDate int64, endDate int64, groupBy int64, mode int64) ([]DialysisStat, error) {
  46. var stats []DialysisStat
  47. var modes []TreatmentMode
  48. if mode > 0 {
  49. modes, _ = getTreatmentModes()
  50. } else {
  51. modes_two, _ := getTreatmentModes()
  52. for _, item := range modes_two {
  53. if item.ModeID == int(mode) {
  54. modes = append(modes, item)
  55. }
  56. }
  57. }
  58. // 获取透析模式
  59. if err != nil {
  60. return nil, err
  61. }
  62. // 构建日期格式
  63. dateFormat := "%Y-%m-%d"
  64. switch groupBy {
  65. case 2:
  66. dateFormat = "%Y-%m-%d"
  67. case 1:
  68. dateFormat = "%Y-%u"
  69. case 3:
  70. dateFormat = "%Y-%m"
  71. case 4:
  72. dateFormat = "%Y"
  73. default:
  74. return nil, fmt.Errorf("invalid group by option")
  75. }
  76. // 构建动态查询语句
  77. selectClauses := []string{fmt.Sprintf("DATE_FORMAT(p.record_date, '%s') AS `日期`", dateFormat)}
  78. for _, mode := range modes {
  79. selectClauses = append(selectClauses, fmt.Sprintf("SUM(CASE WHEN t.mode_name = '%s' THEN 1 ELSE 0 END) AS `%s`", mode.ModeName, mode.ModeName))
  80. }
  81. selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
  82. query := fmt.Sprintf(`
  83. SELECT
  84. %s
  85. FROM
  86. xt_dialysis_prescription p
  87. JOIN
  88. xt_treatment_mode t ON p.mode_id = t.mode_id
  89. WHERE
  90. p.record_date >= ? AND p.record_date <= ?
  91. GROUP BY
  92. DATE_FORMAT(p.record_date, '%s')
  93. `, dateFormat, dateFormat, selectClauses)
  94. rows, err := readDb.Raw(query, startDate, endDate).Rows()
  95. if err != nil {
  96. return nil, err
  97. }
  98. defer rows.Close()
  99. // 解析查询结果
  100. for rows.Next() {
  101. var stat DialysisStat
  102. stat.Counts = make(map[string]int)
  103. cols := []interface{}{&stat.Date}
  104. for _, mode := range modes {
  105. var count int
  106. cols = append(cols, &count)
  107. stat.Counts[mode.ModeName] = count
  108. }
  109. var total int
  110. cols = append(cols, &total)
  111. stat.Total = total
  112. if err := rows.Scan(cols...); err != nil {
  113. return nil, err
  114. }
  115. stats = append(stats, stat)
  116. }
  117. return stats, nil
  118. }
  119. func GetScheduleStats(startDate int64, endDate int64, groupBy int64, mode int64) ([]DialysisStat, error) {
  120. var stats []DialysisStat
  121. var modes []TreatmentMode
  122. if mode > 0 {
  123. modes, _ = getTreatmentModes()
  124. } else {
  125. modes_two, _ := getTreatmentModes()
  126. for _, item := range modes_two {
  127. if item.ModeID == int(mode) {
  128. modes = append(modes, item)
  129. }
  130. }
  131. }
  132. // 获取透析模式
  133. if err != nil {
  134. return nil, err
  135. }
  136. // 构建日期格式
  137. dateFormat := "%Y-%m-%d"
  138. switch groupBy {
  139. case 2:
  140. dateFormat = "%Y-%m-%d"
  141. case 1:
  142. dateFormat = "%Y-%u"
  143. case 3:
  144. dateFormat = "%Y-%m"
  145. case 4:
  146. dateFormat = "%Y"
  147. default:
  148. return nil, fmt.Errorf("invalid group by option")
  149. }
  150. // 构建动态查询语句
  151. selectClauses := []string{fmt.Sprintf("DATE_FORMAT(p.schudle_date, '%s') AS `日期`", dateFormat)}
  152. for _, mode := range modes {
  153. selectClauses = append(selectClauses, fmt.Sprintf("SUM(CASE WHEN t.mode_name = '%s' THEN 1 ELSE 0 END) AS `%s`", mode.ModeName, mode.ModeName))
  154. }
  155. selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
  156. query := fmt.Sprintf(`
  157. SELECT
  158. %s
  159. FROM
  160. xt_schedule p
  161. JOIN
  162. xt_treatment_mode t ON p.mode_id = t.mode_id
  163. WHERE
  164. p.schedule_date >= ? AND p.schedule_date <= ?
  165. GROUP BY
  166. DATE_FORMAT(p.schedule_date, '%s')
  167. `, dateFormat, dateFormat, selectClauses)
  168. rows, err := readDb.Raw(query, startDate, endDate).Rows()
  169. if err != nil {
  170. return nil, err
  171. }
  172. defer rows.Close()
  173. // 解析查询结果
  174. for rows.Next() {
  175. var stat DialysisStat
  176. stat.Counts = make(map[string]int)
  177. cols := []interface{}{&stat.Date}
  178. for _, mode := range modes {
  179. var count int
  180. cols = append(cols, &count)
  181. stat.Counts[mode.ModeName] = count
  182. }
  183. var total int
  184. cols = append(cols, &total)
  185. stat.Total = total
  186. if err := rows.Scan(cols...); err != nil {
  187. return nil, err
  188. }
  189. stats = append(stats, stat)
  190. }
  191. return stats, nil
  192. }
  193. func GetNewDialysisCountMode(starttime int64, endtime int64, orgid int64, origin int64, mode_id int64) (counts []*models.PatientPrescriptionCountStruct, err error) {
  194. if origin == 1 {
  195. db := readDb.Table("xt_dialysis_order as o").Where("o.status = 1")
  196. if starttime > 0 {
  197. db = db.Where("o.dialysis_date >=?", starttime)
  198. }
  199. if endtime > 0 {
  200. db = db.Where("o.dialysis_date<=?", endtime)
  201. }
  202. if orgid > 0 {
  203. db = db.Where("o.user_org_id = ?", orgid)
  204. }
  205. if mode_id == 0 {
  206. 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
  207. } else {
  208. 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
  209. }
  210. return counts, err
  211. } else {
  212. db := readDb.Table("xt_schedule as o").Where("o.status = 1").Select("patient_id, schedule_date").Group("patient_id, schedule_date,mode_id")
  213. if starttime > 0 {
  214. db = db.Where("o.schedule_date >= ?", starttime)
  215. }
  216. if endtime > 0 {
  217. db = db.Where("o.schedule_date <= ?", endtime)
  218. }
  219. if orgid > 0 {
  220. db = db.Where("o.user_org_id = ?", orgid)
  221. }
  222. err = db.Select("o.mode_id,count(o.mode_id) as count").Scan(&counts).Error
  223. return counts, err
  224. }
  225. }
  226. func GetNewDialysisCountModeTwo(starttime int64, endtime int64, orgid int64, origin int64, mode_id int64) (counts models.CustomDialysisData, err error) {
  227. if origin == 1 {
  228. db := readDb.Table("xt_dialysis_order as o").Where("o.status = 1")
  229. if starttime > 0 {
  230. db = db.Where("o.dialysis_date >=?", starttime)
  231. }
  232. if endtime > 0 {
  233. db = db.Where("o.dialysis_date<=?", endtime)
  234. }
  235. if orgid > 0 {
  236. db = db.Where("o.user_org_id = ?", orgid)
  237. }
  238. 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
  239. return counts, err
  240. } else {
  241. db := readDb.Table("xt_schedule as o").Where("o.status = 1").Select("patient_id, schedule_date").Group("patient_id, schedule_date,mode_id")
  242. if starttime > 0 {
  243. db = db.Where("o.schedule_date >= ?", starttime)
  244. }
  245. if endtime > 0 {
  246. db = db.Where("o.schedule_date <= ?", endtime)
  247. }
  248. if orgid > 0 {
  249. db = db.Where("o.user_org_id = ?", orgid)
  250. }
  251. if mode_id > 0 {
  252. db = db.Where("o.mode_id = ?", mode_id)
  253. }
  254. err = db.Select("o.mode_id,count(o.mode_id) as count").Scan(&counts).Error
  255. return counts, err
  256. }
  257. }
  258. var anticoagulantMap = map[int]string{
  259. 1: "无肝素",
  260. 2: "普通肝素",
  261. 3: "低分子肝素",
  262. 4: "阿加曲班",
  263. 5: "枸橼酸钠",
  264. 6: "低分子肝素钙",
  265. 7: "低分子肝素钠",
  266. 8: "依诺肝素",
  267. 9: "达肝素",
  268. 10: "体外抗凝",
  269. 11: "那屈肝素",
  270. 12: "无抗凝剂",
  271. 13: "那屈肝素钙",
  272. 14: "肝素钙注射液",
  273. 15: "甲磺酸萘莫司他",
  274. 16: "低分子量肝素钙",
  275. 17: "肝素钠",
  276. }
  277. func GetAnticoagulantData(start_time int64, end_time int64, org_id int64) (map[string]int, error) {
  278. var results []struct {
  279. Anticoagulant int
  280. Count int
  281. }
  282. err := XTReadDB().Model(&models.DialysisPrescription{}).
  283. Select("anticoagulant, COUNT(*) as count").
  284. Where("status = 1 and record_date >= ? and record_date <= ? and user_org_id = ?", start_time, end_time, org_id).
  285. Group("anticoagulant").
  286. Scan(&results).Error
  287. if err != nil {
  288. return nil, err
  289. }
  290. anticoagulantData := make(map[string]int)
  291. for _, result := range results {
  292. if name, ok := anticoagulantMap[result.Anticoagulant]; ok {
  293. anticoagulantData[name] = result.Count
  294. } else {
  295. anticoagulantData[fmt.Sprintf("Unknown (%d)", result.Anticoagulant)] = result.Count
  296. }
  297. }
  298. return anticoagulantData, nil
  299. }
  300. func GetAnticoagulantTotal(start_time int64, end_time int64, org_id int64) (total int64, err error) {
  301. err = XTReadDB().Model(&models.DialysisPrescription{}).
  302. Where("record_date >= ? and record_date <= ? and user_org_id = ? and status = 1", start_time, end_time, org_id).
  303. Count(&total).Error
  304. return
  305. }
  306. func GetDialyzerSummary(org_id int64) ([]string, error) {
  307. var Dialyzer []string
  308. err := XTReadDB().Model(&models.DialysisPrescription{}).
  309. Select("dialysis_dialyszers").
  310. Where(" user_org_id = ? and status = 1", org_id).
  311. Group("dialysis_dialyszers").
  312. Scan(&Dialyzer).Error
  313. if err != nil {
  314. return nil, err
  315. }
  316. return Dialyzer, nil
  317. }
  318. type DialyzerResult struct {
  319. Dialyzer string
  320. Count int
  321. }
  322. func GetDialyzerData(start_time int64, end_time int64, org_id int64) (dr []DialyzerResult, err error) {
  323. err = XTReadDB().Model(&models.DialysisPrescription{}).
  324. Select("dialysis_dialyszers as dialyzer, COUNT(*) as count").
  325. Where("record_date >= ? and record_date <= ? and user_org_id = ? and status = 1", start_time, end_time, org_id).
  326. Group("dialysis_dialyszers").
  327. Scan(&dr).Error
  328. return
  329. }
  330. func GetDialyzerTotal(start_time int64, end_time int64, org_id int64) (total int64, err error) {
  331. err = XTReadDB().Model(&models.DialysisPrescription{}).
  332. Where("status = 1 and record_date >= ? and record_date <= ? and user_org_id = ? and dialysis_dialyszers <> ''", start_time, end_time, org_id).
  333. Count(&total).Error
  334. return
  335. }
  336. func GetPrescriptionByAnticoagulant(page int64, limit int64, orgid int64, anticoagulant int64, start_time int64, end_time int64) (solution []*models.DialysisPrescription, total int64, err error) {
  337. db := XTReadDB().Model(&models.DialysisPrescription{}).Where("status = 1")
  338. if anticoagulant > 0 {
  339. db = db.Where("anticoagulant = ?", anticoagulant)
  340. }
  341. if orgid > 0 {
  342. db = db.Where("user_org_id = ?", orgid)
  343. }
  344. db = db.Where("record_date >= ? and record_date <= ?", start_time, end_time)
  345. offset := (page - 1) * limit
  346. err = db.Count(&total).Offset(offset).Limit(limit).Find(&solution).Error
  347. return solution, total, err
  348. }
  349. func GetPrescriptionByDialyzer(page int64, limit int64, orgid int64, dialyzer string, start_time int64, end_time int64) (solution []*models.DialysisPrescription, total int64, err error) {
  350. db := XTReadDB().Model(&models.DialysisPrescription{}).Where("status = 1")
  351. if len(dialyzer) > 0 {
  352. db = db.Where("dialysis_dialyszers = ?", dialyzer)
  353. }
  354. if orgid > 0 {
  355. db = db.Where("user_org_id = ?", orgid)
  356. }
  357. db = db.Where("record_date >= ? and record_date <= ?", start_time, end_time)
  358. offset := (page - 1) * limit
  359. err = db.Count(&total).Offset(offset).Limit(limit).Find(&solution).Error
  360. return solution, total, err
  361. }
  362. type DialysisData struct {
  363. DialysisStatus string `json:"dialysis_status"`
  364. Count int `json:"count"`
  365. }
  366. type CustomData struct {
  367. DialysisNo string
  368. PatientName string
  369. DialysisDate string
  370. DialysisDuration string
  371. ActualDuration string
  372. Diff string
  373. Doctor string
  374. Nurse string
  375. }
  376. func GetDialysisCompletionRate(org_id int64, start_time int64, end_time int64) (map[string]int, error) {
  377. var results []DialysisData
  378. query := `
  379. SELECT
  380. CASE
  381. 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 '达标'
  382. 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 '未达标'
  383. ELSE '超时'
  384. END AS dialysis_status,
  385. COUNT(*) AS count
  386. FROM
  387. xt_dialysis_order o
  388. JOIN
  389. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  390. JOIN
  391. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  392. WHERE
  393. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  394. GROUP BY
  395. dialysis_status;
  396. `
  397. if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Scan(&results).Error; err != nil {
  398. return nil, err
  399. }
  400. dialysisCompletionRate := make(map[string]int)
  401. for _, result := range results {
  402. dialysisCompletionRate[result.DialysisStatus] = result.Count
  403. }
  404. return dialysisCompletionRate, nil
  405. }
  406. func GetDialysisCompletionTotal(org_id int64, start_time int64, end_time int64) (int64, error) {
  407. var Count int64
  408. query := `
  409. SELECT
  410. COUNT(*) AS count
  411. FROM
  412. xt_dialysis_order o
  413. JOIN
  414. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  415. JOIN
  416. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  417. WHERE
  418. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  419. GROUP BY
  420. dialysis_status;
  421. `
  422. if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Scan(&Count).Error; err != nil {
  423. return 0, err
  424. }
  425. return Count, nil
  426. }
  427. func GetDialysisCompletionDetail(org_id int64, start_time int64, end_time int64, mode int64, limit int64, page int64) (date []*CustomData, total int64, err error) {
  428. var query string
  429. if mode == 0 {
  430. query = `
  431. SELECT
  432. p.dialysis_no as dialysis_no,
  433. p.name as patient_name,
  434. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  435. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  436. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  437. 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,
  438. p.prescription_doctor as doctor,
  439. p.finish_nurse as nurse
  440. FROM
  441. xt_dialysis_order o
  442. JOIN
  443. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  444. JOIN
  445. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  446. JOIN
  447. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  448. WHERE
  449. o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
  450. `
  451. } else if mode == 1 {
  452. query = `
  453. SELECT
  454. p.dialysis_no as dialysis_no,
  455. p.name as patient_name,
  456. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  457. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  458. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  459. 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,
  460. p.prescription_doctor as doctor,
  461. p.finish_nurse as nurse
  462. FROM
  463. xt_dialysis_order o
  464. JOIN
  465. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  466. JOIN
  467. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  468. JOIN
  469. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  470. WHERE
  471. 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
  472. `
  473. } else if mode == 2 {
  474. query = `
  475. SELECT
  476. p.dialysis_no as dialysis_no,
  477. p.name as patient_name,
  478. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  479. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  480. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  481. 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,
  482. p.prescription_doctor as doctor,
  483. p.finish_nurse as nurse
  484. FROM
  485. xt_dialysis_order o
  486. JOIN
  487. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  488. JOIN
  489. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  490. JOIN
  491. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  492. WHERE
  493. 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
  494. `
  495. } else if mode == 3 {
  496. query = `
  497. SELECT
  498. p.dialysis_no as dialysis_no,
  499. p.name as patient_name,
  500. FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
  501. CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
  502. CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
  503. 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,
  504. p.prescription_doctor as doctor,
  505. p.finish_nurse as nurse
  506. FROM
  507. xt_dialysis_order o
  508. JOIN
  509. xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
  510. JOIN
  511. xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
  512. JOIN
  513. xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
  514. WHERE
  515. 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
  516. `
  517. }
  518. offset := (page - 1) * limit
  519. if err := readDb.Raw(query, org_id, org_id, org_id, org_id, start_time, end_time).Count(&total).Offset(offset).Limit(limit).Scan(&date).Error; err != nil {
  520. return nil, 0, err
  521. }
  522. return
  523. }
  524. type QualityControlStandard struct {
  525. ItemName string `json:"item_name"`
  526. ProjectMame string `json:"project_name"`
  527. InspectionMajor int64 `json:"inspection_major"`
  528. InspectionMinor int64 `json:"inspection_minor"`
  529. }
  530. func getQualityControlStandards(org_id int64) ([]QualityControlStandard, error) {
  531. var standards []QualityControlStandard
  532. 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 {
  533. return nil, err
  534. }
  535. return standards, nil
  536. }
  537. type DialysisQualityStat struct {
  538. Month string `json:"月"`
  539. Name string `json:"姓名"`
  540. Counts map[string]float64 `json:"counts"`
  541. }
  542. func GetLatestInspectionValues(org_id int64, yearMonth string) ([]map[string]interface{}, error) {
  543. standards, err := getQualityControlStandards(org_id)
  544. if err != nil {
  545. return nil, err
  546. }
  547. var selectFields []string
  548. for _, standard := range standards {
  549. field := fmt.Sprintf("MAX(CASE WHEN i.item_name = %s THEN i.inspect_value END) AS `%s`",
  550. "'"+standard.ItemName+"'", standard.ItemName)
  551. selectFields = append(selectFields, field)
  552. }
  553. query := fmt.Sprintf(`
  554. SELECT
  555. p.name as '姓名',
  556. %s
  557. FROM xt_inspection i
  558. JOIN xt_patients p On p.id = i.patient_id
  559. WHERE DATE_FORMAT(FROM_UNIXTIME(i.inspect_date), '%%Y-%%m') = ? and org_id = ?
  560. GROUP BY i.patient_id
  561. `, strings.Join(selectFields, ", "))
  562. var results []map[string]interface{}
  563. rows, err := readDb.Raw(query, yearMonth, org_id).Rows()
  564. if err != nil {
  565. return nil, err
  566. }
  567. defer rows.Close()
  568. columns, err := rows.Columns()
  569. if err != nil {
  570. return nil, err
  571. }
  572. for rows.Next() {
  573. // 创建一个长度为列数的切片,用于存储每一行的值
  574. columnValues := make([]interface{}, len(columns))
  575. columnPointers := make([]interface{}, len(columns))
  576. for i := range columnValues {
  577. columnPointers[i] = &columnValues[i]
  578. }
  579. // 扫描当前行的值
  580. if err := rows.Scan(columnPointers...); err != nil {
  581. return nil, err
  582. }
  583. // 将扫描到的值放入结果 map 中
  584. result := make(map[string]interface{})
  585. for i, colName := range columns {
  586. val := columnPointers[i].(*interface{})
  587. result[colName] = *val
  588. }
  589. results = append(results, result)
  590. }
  591. return results, nil
  592. }