Ver código fonte

提交代码

陈少旭 9 meses atrás
pai
commit
07bdd92c72
2 arquivos alterados com 281 adições e 131 exclusões
  1. 72 19
      controllers/statistics_api_controller.go
  2. 209 112
      service/statistis_qc_service.go

+ 72 - 19
controllers/statistics_api_controller.go Ver arquivo

@@ -169,18 +169,58 @@ func (c *StatisticsApiController) GetDialysisTotal() {
169 169
 		case 1:
170 170
 			// 按周统计
171 171
 			weeks := groupByWeek(dates)
172
+			fmt.Println(weeks)
172 173
 			for _, week := range weeks {
174
+				// 解析字符串时显式指定时区为 UTC
175
+				t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", week[0].String())
176
+				if err != nil {
177
+					fmt.Println("解析时间出错:", err)
178
+					return
179
+				}
180
+
181
+				// 格式化时间时将时区设置为 UTC
182
+				//fmt.Println(t.UTC().Format("2006-01-02 15:04:05"))
183
+
173 184
 				var cus models.CustomDialysisData
174
-				counts, _ := service.GetNewDialysisCountModeTwo(week[0].Unix(), week[len(week)-1].Unix(), c.GetAdminUserInfo().CurrentOrgId, origin, mode)
185
+				//week_date := week[0].Format("2006-01-02") + " 00:00:00"
186
+
187
+				//date, err := time.Parse("2006-01-02 15:04:05", week_date)
188
+				//if err != nil {
189
+				//	fmt.Println("日期解析错误:", err)
190
+				//	return
191
+				//}
192
+
193
+				// 将time.Time类型转换为时间戳(秒)
194
+				//week_start := date.Unix()
195
+
196
+				// 解析字符串时显式指定时区为 UTC
197
+				t2, err := time.Parse("2006-01-02 15:04:05 -0700 MST", week[len(week)-1].String())
198
+				if err != nil {
199
+					fmt.Println("解析时间出错:", err)
200
+					return
201
+				}
202
+
203
+				//week_end_date := week[len(week)-1].Format("2006-01-02") + " 00:00:00"
204
+
205
+				//end_date, err := time.Parse("2006-01-02 15:04:05", week_end_date)
206
+				//if err != nil {
207
+				//	fmt.Println("日期解析错误:", err)
208
+				//	return
209
+				//}
210
+				//
211
+				//// 将time.Time类型转换为时间戳(秒)
212
+				//week_end := end_date.Unix()
213
+
214
+				counts, _ := service.GetNewDialysisCountModeTwo(t.Unix(), t2.Unix(), c.GetAdminUserInfo().CurrentOrgId, origin, mode)
175 215
 				cus.Date = strings.Split(week[0].String(), " ")[0] + "~" + strings.Split(week[len(week)-1].String(), " ")[0]
176 216
 				cus.Count = counts.Count
177 217
 				cus.Total = p_total
178 218
 				cuss = append(cuss, cus)
179
-				c.ServeSuccessJSON(map[string]interface{}{
180
-					"list": cuss,
181
-				})
182
-			}
183 219
 
220
+			}
221
+			c.ServeSuccessJSON(map[string]interface{}{
222
+				"list": cuss,
223
+			})
184 224
 			break
185 225
 		case 2:
186 226
 			startDate, err := time.Parse("2006-01-02", start_date)
@@ -203,12 +243,11 @@ func (c *StatisticsApiController) GetDialysisTotal() {
203 243
 				cus.Count = counts.Count
204 244
 				cus.Total = p_total
205 245
 				cuss = append(cuss, cus)
206
-				c.ServeSuccessJSON(map[string]interface{}{
207
-					"list": cuss,
208
-				})
209 246
 
210 247
 			}
211
-
248
+			c.ServeSuccessJSON(map[string]interface{}{
249
+				"list": cuss,
250
+			})
212 251
 			break
213 252
 		case 3:
214 253
 			// 按月统计
@@ -220,11 +259,12 @@ func (c *StatisticsApiController) GetDialysisTotal() {
220 259
 				cus.Count = counts.Count
221 260
 				cus.Total = p_total
222 261
 				cuss = append(cuss, cus)
223
-				c.ServeSuccessJSON(map[string]interface{}{
224
-					"list": cuss,
225
-				})
262
+
226 263
 				//fmt.Println("Month:", month[0], "~", month[len(month)-1])
227 264
 			}
265
+			c.ServeSuccessJSON(map[string]interface{}{
266
+				"list": cuss,
267
+			})
228 268
 			break
229 269
 		case 4:
230 270
 			// 按年统计
@@ -232,14 +272,15 @@ func (c *StatisticsApiController) GetDialysisTotal() {
232 272
 			for _, year := range years {
233 273
 				var cus models.CustomDialysisData
234 274
 				counts, _ := service.GetNewDialysisCountModeTwo(year[0].Unix(), year[len(year)-1].Unix(), c.GetAdminUserInfo().CurrentOrgId, origin, mode)
235
-				cus.Date = strings.Split(year[0].String(), " ")[0] + "~" + strings.Split(year[len(year)-1].String(), " ")[0]
275
+				cus.Date = strings.Split(strings.Split(year[0].String(), " ")[0], "-")[0]
236 276
 				cus.Count = counts.Count
237 277
 				cus.Total = p_total
238 278
 				cuss = append(cuss, cus)
239
-				c.ServeSuccessJSON(map[string]interface{}{
240
-					"list": cuss,
241
-				})
279
+
242 280
 			}
281
+			c.ServeSuccessJSON(map[string]interface{}{
282
+				"list": cuss,
283
+			})
243 284
 			break
244 285
 		}
245 286
 	}
@@ -675,10 +716,10 @@ func (c *StatisticsApiController) GetFivePatientInspectionStatistisc() {
675 716
 
676 717
 	dynamicFields := make([]map[string]interface{}, 0)
677 718
 	list, _ := service.GetLatestInspectionValues(c.GetAdminUserInfo().CurrentOrgId, strings.Split(end_date, "-")[0]+"-"+strings.Split(end_date, "-")[1])
678
-	fmt.Println(list)
719
+	//fmt.Println(list)
679 720
 
680 721
 	for _, result := range list {
681
-		fmt.Println(result)
722
+		//fmt.Println(result)
682 723
 		// 打印患者ID
683 724
 		nb := result["姓名"].([]byte)
684 725
 		name := string(nb)
@@ -690,6 +731,11 @@ func (c *StatisticsApiController) GetFivePatientInspectionStatistisc() {
690 731
 		ynamicField["姓名"] = name
691 732
 		// 打印其他列的值
692 733
 		for columnName, columnValue := range result {
734
+
735
+			fmt.Println("000000")
736
+			fmt.Println(columnName)
737
+			fmt.Println("000000")
738
+
693 739
 			// 跳过患者ID列
694 740
 
695 741
 			if columnName == "姓名" {
@@ -722,7 +768,14 @@ func (c *StatisticsApiController) GetFivePatientInspectionStatistisc() {
722 768
 				fmt.Printf("Column: %s, Value: %f\n", columnName, floatValue)
723 769
 			}
724 770
 			ynamicField["年月"] = strings.Split(end_date, "-")[0] + "-" + strings.Split(end_date, "-")[1]
725
-			ynamicField[columnName] = floatValue
771
+			if floatValue == 0 {
772
+				ynamicField[columnName] = ""
773
+
774
+			} else {
775
+				ynamicField[columnName] = floatValue
776
+
777
+			}
778
+			fmt.Println(ynamicField)
726 779
 			dynamicFields = append(dynamicFields, ynamicField)
727 780
 		}
728 781
 	}

+ 209 - 112
service/statistis_qc_service.go Ver arquivo

@@ -3,7 +3,9 @@ package service
3 3
 import (
4 4
 	"XT_New/models"
5 5
 	"fmt"
6
+	"reflect"
6 7
 	"strings"
8
+	"time"
7 9
 )
8 10
 
9 11
 func GetDialysisTotalDatas() {
@@ -14,20 +16,20 @@ func GetNewDialysiTotal(startime int64, endtime int64, orgid int64, origin int64
14 16
 	counts := models.PatientPrescriptionCountStruct{}
15 17
 	var err error
16 18
 	if origin == 1 { //透析记录,上机为准
17
-		db := XTReadDB().Table("xt_dialysis_order as x")
19
+		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 20
 		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 21
 		return counts.Count, err
20 22
 
21 23
 	} else {
22
-		db := XTReadDB().Table("xt_schedule as sch")
23
-		//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
24 24
 		var count int64
25
-		err := db.Model(&Schedule{}).
26
-			Select("patient_id, schedule_date").
25
+		var schs []models.Schedule
26
+		db := XTReadDB().Model(&models.Schedule{})
27
+		err := db.
27 28
 			Group("patient_id, schedule_date").
28
-			Where("schedule_date >= ? AND schedule_date  <= ?", startime, endtime).
29
-			Count(&count).
29
+			Where("schedule_date >= ? AND schedule_date  <= ? and user_org_id = ? and status = 1", startime, endtime, orgid).
30
+			Find(&schs).
30 31
 			Error
32
+		count = int64(len(schs))
31 33
 		return count, err
32 34
 
33 35
 	}
@@ -237,17 +239,7 @@ func GetNewDialysisCountMode(starttime int64, endtime int64, orgid int64, origin
237 239
 		return counts, err
238 240
 
239 241
 	} else {
240
-		db := readDb.Table("xt_schedule as o").Where("o.status = 1").Select("patient_id, schedule_date").Group("patient_id, schedule_date,mode_id")
241
-		if starttime > 0 {
242
-			db = db.Where("o.schedule_date >= ?", starttime)
243
-		}
244
-		if endtime > 0 {
245
-			db = db.Where("o.schedule_date <= ?", endtime)
246
-		}
247
-		if orgid > 0 {
248
-			db = db.Where("o.user_org_id = ?", orgid)
249
-		}
250
-		err = db.Select("o.mode_id,count(o.mode_id) as count").Scan(&counts).Error
242
+		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
251 243
 		return counts, err
252 244
 
253 245
 	}
@@ -255,28 +247,52 @@ func GetNewDialysisCountMode(starttime int64, endtime int64, orgid int64, origin
255 247
 }
256 248
 
257 249
 func GetNewDialysisCountModeTwo(starttime int64, endtime int64, orgid int64, origin int64, mode_id int64) (counts models.CustomDialysisData, err error) {
250
+
251
+	// 将时间戳转换为time.Time类型
252
+	t := time.Unix(starttime, 0)
253
+
254
+	// 使用布局定义格式化时间
255
+	layout := "2006-01-02"
256
+
257
+	// 将时间格式化为字符串
258
+	startDate := t.Format(layout) + " 00:00:00"
259
+
260
+	t2 := time.Unix(endtime, 0)
261
+
262
+	// 使用布局定义格式化时间
263
+	//layout := "2006-01-02"
264
+
265
+	// 将时间格式化为字符串
266
+	endDate := t2.Format(layout) + " 00:00:00"
267
+	//fmt.Println(formattedDate)
268
+
269
+	// 将日期字符串解析为time.Time类型
270
+	//start, _ := time.Parse("2006-01-02 15:04:05", formattedDate)
271
+	//starttime = start.Unix()
272
+	//fmt.Println(starttime)
273
+
258 274
 	if origin == 1 {
259 275
 		db := readDb.Table("xt_dialysis_order as o").Where("o.status = 1")
260 276
 		if starttime > 0 {
261
-			db = db.Where("o.dialysis_date >=?", starttime)
277
+			db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.dialysis_date), '%Y-%m-%d %H:%i:%s') >= ?", startDate)
262 278
 		}
263 279
 		if endtime > 0 {
264
-			db = db.Where("o.dialysis_date<=?", endtime)
280
+			db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.dialysis_date), '%Y-%m-%d %H:%i:%s') <= ?", endDate)
265 281
 		}
266 282
 		if orgid > 0 {
267 283
 			db = db.Where("o.user_org_id = ?", orgid)
268 284
 		}
269 285
 
270
-		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
286
+		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
271 287
 		return counts, err
272 288
 
273 289
 	} else {
274
-		db := readDb.Table("xt_schedule as o").Where("o.status = 1").Select("patient_id, schedule_date").Group("patient_id, schedule_date,mode_id")
290
+		db := readDb.Table("xt_schedule as o").Where("o.status = 1").Select("patient_id, schedule_date").Group("mode_id")
275 291
 		if starttime > 0 {
276
-			db = db.Where("o.schedule_date >= ?", starttime)
292
+			db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.schedule_date),'%Y-%m-%d %H:%i:%s') >= ?", startDate)
277 293
 		}
278 294
 		if endtime > 0 {
279
-			db = db.Where("o.schedule_date <= ?", endtime)
295
+			db = db.Where("DATE_FORMAT(FROM_UNIXTIME(o.schedule_date),'%Y-%m-%d %H:%i:%s') <= ?", endDate)
280 296
 		}
281 297
 		if orgid > 0 {
282 298
 			db = db.Where("o.user_org_id = ?", orgid)
@@ -471,116 +487,185 @@ func GetDialysisCompletionTotal(org_id int64, start_time int64, end_time int64)
471 487
             xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
472 488
         WHERE
473 489
             o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
474
-        GROUP BY
475
-            dialysis_status;
476 490
     `
477
-	if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Scan(&Count).Error; err != nil {
491
+	if err := readDb.Raw(query, org_id, org_id, org_id, start_time, end_time).Count(&Count).Error; err != nil {
478 492
 		return 0, err
479 493
 	}
480 494
 
481 495
 	return Count, nil
482 496
 }
483
-func GetDialysisCompletionDetail(org_id int64, start_time int64, end_time int64, mode int64, limit int64, page int64) (date []*CustomData, total int64, err error) {
497
+func GetDialysisCompletionDetail(org_id int64, start_time int64, end_time int64, mode int64, limit int64, page int64) (results []interface{}, total int64, err error) {
484 498
 	var query string
485 499
 	if mode == 0 {
486 500
 		query = `
487
-        SELECT
488
-           p.dialysis_no as dialysis_no,
489
-           p.name as patient_name,
490
-           FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
491
-           CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
492
-           CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
493
-           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,
494
-           p.prescription_doctor as doctor,
495
-           p.finish_nurse as nurse
496
-        FROM
497
-            xt_dialysis_order o
498
-    	JOIN           
499
-            xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
500
-        JOIN
501
-            xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
502
-        JOIN
503
-            xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
504
-        WHERE
505
-            o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
506
-    `
501
+	   SELECT
502
+	      p.dialysis_no as dialysis_no,
503
+	      p.name as patient_name,
504
+	      FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
505
+	      CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
506
+	      CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
507
+	      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,
508
+	      p.prescription_doctor as doctor,
509
+	      o.finish_nurse as nurse
510
+	   FROM
511
+	       xt_dialysis_order o
512
+		JOIN
513
+	       xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
514
+	   JOIN
515
+	       xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
516
+	   JOIN
517
+	       xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
518
+	   WHERE
519
+	       o.stage = 2 AND o.user_org_id = ? AND o.dialysis_date >= ? AND o.dialysis_date <= ?
520
+	`
521
+
522
+		readDb.Table("xt_dialysis_order o").
523
+			Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
524
+			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).
525
+			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).
526
+			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)
507 527
 
508 528
 	} else if mode == 1 {
509 529
 		query = `
510
-        SELECT
511
-           p.dialysis_no as dialysis_no,
512
-           p.name as patient_name,
513
-           FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
514
-           CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
515
-           CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
516
-           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,
517
-           p.prescription_doctor as doctor,
518
-           p.finish_nurse as nurse
519
-        FROM
520
-            xt_dialysis_order o
521
-    	JOIN           
522
-            xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
523
-        JOIN
524
-            xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
525
-        JOIN
526
-            xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
527
-        WHERE
528
-            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
529
-    `
530
+	   SELECT
531
+	      pp.dialysis_no as dialysis_no,
532
+	      pp.name as patient_name,
533
+	      FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
534
+	      CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
535
+	      CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
536
+	      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,
537
+	      p.prescription_doctor as doctor,
538
+	      o.finish_nurse as nurse
539
+	   FROM
540
+	       xt_dialysis_order o
541
+		JOIN
542
+	       xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
543
+	   JOIN
544
+	       xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
545
+	   JOIN
546
+	       xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
547
+	   WHERE
548
+	       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
549
+	`
550
+		readDb.Table("xt_dialysis_order o").
551
+			Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
552
+			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).
553
+			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).
554
+			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)
530 555
 
531 556
 	} else if mode == 2 {
532 557
 		query = `
533
-        SELECT
534
-           p.dialysis_no as dialysis_no,
535
-           p.name as patient_name,
536
-           FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
537
-           CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
538
-           CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
539
-           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,
540
-           p.prescription_doctor as doctor,
541
-           p.finish_nurse as nurse
542
-        FROM
543
-            xt_dialysis_order o
544
-    	JOIN           
545
-            xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
546
-        JOIN
547
-            xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
548
-        JOIN
549
-            xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
550
-        WHERE
551
-            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
552
-    `
558
+	   SELECT
559
+	      pp.dialysis_no as dialysis_no,
560
+	      pp.name as patient_name,
561
+	      FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
562
+	      CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
563
+	      CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
564
+	      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,
565
+	      p.prescription_doctor as doctor,
566
+	      o.finish_nurse as nurse
567
+	   FROM
568
+	       xt_dialysis_order o
569
+		JOIN
570
+	       xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
571
+	   JOIN
572
+	       xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
573
+	   JOIN
574
+	       xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
575
+	   WHERE
576
+	       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
577
+	`
578
+		readDb.Table("xt_dialysis_order o").
579
+			Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
580
+			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).
581
+			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).
582
+			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)
553 583
 
554 584
 	} else if mode == 3 {
555 585
 		query = `
556
-        SELECT
557
-           p.dialysis_no as dialysis_no,
558
-           p.name as patient_name,
559
-           FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
560
-           CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
561
-           CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
562
-           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,
563
-           p.prescription_doctor as doctor,
564
-           p.finish_nurse as nurse
565
-        FROM
566
-            xt_dialysis_order o
567
-    	JOIN           
568
-            xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
569
-        JOIN
570
-            xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
571
-        JOIN
572
-            xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
573
-        WHERE
574
-            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
575
-    `
586
+	   SELECT
587
+	      pp.dialysis_no as dialysis_no,
588
+	      pp.name as patient_name,
589
+	      FROM_UNIXTIME(o.dialysis_date) as dialysis_date,
590
+	      CONCAT(p.dialysis_duration_hour, 'h', p.dialysis_duration_minute,'min') as dialysis_duration,
591
+	      CONCAT(a.actual_treatment_hour, 'h', a.actual_treatment_minute,'min') as actual_duration,
592
+	      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,
593
+	      p.prescription_doctor as doctor,
594
+	      o.finish_nurse as nurse
595
+	   FROM
596
+	       xt_dialysis_order o
597
+		JOIN
598
+	       xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?
599
+	   JOIN
600
+	       xt_dialysis_prescription p ON o.dialysis_date = p.record_date AND o.patient_id = p.patient_id AND p.user_org_id = ?
601
+	   JOIN
602
+	       xt_assessment_after_dislysis a ON o.dialysis_date = a.assessment_date AND o.patient_id = a.patient_id AND a.user_org_id = ?
603
+	   WHERE
604
+	       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
605
+	`
606
+		readDb.Table("xt_dialysis_order o").
607
+			Joins("JOIN xt_patients pp ON o.patient_id = pp.id AND pp.user_org_id = ?", org_id).
608
+			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).
609
+			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).
610
+			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)
611
+
576 612
 	}
613
+
577 614
 	offset := (page - 1) * limit
578 615
 
579
-	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 {
580
-		return nil, 0, err
616
+	rows, err := readDb.Raw(query, org_id, org_id, org_id, org_id, start_time, end_time).Offset(offset).Limit(limit).Rows()
617
+	if err != nil {
618
+		fmt.Println(err)
581 619
 	}
620
+	defer rows.Close()
582 621
 
583
-	return
622
+	// Define a map to hold the dynamic fields
623
+	fields := map[string]interface{}{
624
+		"dialysis_no":       "",
625
+		"patient_name":      "",
626
+		"dialysis_date":     "",
627
+		"dialysis_duration": "",
628
+		"actual_duration":   "",
629
+		"diff":              0,
630
+		"doctor":            "",
631
+		"nurse":             "",
632
+	}
633
+
634
+	// Create the dynamic struct type
635
+	dynamicStructType := createDynamicStruct(fields)
636
+
637
+	// Slice to hold the results
638
+	//var results []interface{}
639
+
640
+	// Iterate over the rows and scan into the dynamic struct
641
+	for rows.Next() {
642
+		// Create a new instance of the dynamic struct
643
+		result := reflect.New(dynamicStructType).Interface()
644
+
645
+		// Create a slice of pointers to the fields in the struct
646
+		fieldPtrs := []interface{}{
647
+			reflect.ValueOf(result).Elem().FieldByName("Dialysis_no").Addr().Interface(),
648
+			reflect.ValueOf(result).Elem().FieldByName("Patient_name").Addr().Interface(),
649
+			reflect.ValueOf(result).Elem().FieldByName("Dialysis_date").Addr().Interface(),
650
+			reflect.ValueOf(result).Elem().FieldByName("Dialysis_duration").Addr().Interface(),
651
+			reflect.ValueOf(result).Elem().FieldByName("Actual_duration").Addr().Interface(),
652
+			reflect.ValueOf(result).Elem().FieldByName("Diff").Addr().Interface(),
653
+			reflect.ValueOf(result).Elem().FieldByName("Doctor").Addr().Interface(),
654
+			reflect.ValueOf(result).Elem().FieldByName("Nurse").Addr().Interface(),
655
+		}
656
+
657
+		// Scan the row into the struct
658
+		if err := rows.Scan(fieldPtrs...); err != nil {
659
+			//log.Fatalf("failed to scan row: %v", err)
660
+			fmt.Println(err)
661
+
662
+		}
663
+
664
+		// Append the result to the slice
665
+		results = append(results, result)
666
+	}
667
+
668
+	return results, total, err
584 669
 }
585 670
 
586 671
 type QualityControlStandard struct {
@@ -612,7 +697,7 @@ func GetLatestInspectionValues(org_id int64, yearMonth string) ([]map[string]int
612 697
 
613 698
 	var selectFields []string
614 699
 	for _, standard := range standards {
615
-		field := fmt.Sprintf("MAX(CASE WHEN i.item_name = %s THEN i.inspect_value END) AS `%s`",
700
+		field := fmt.Sprintf("IFNULL(MAX(CASE WHEN i.item_name = %s THEN i.inspect_value END),'') AS `%s`",
616 701
 			"'"+standard.ItemName+"'", standard.ItemName)
617 702
 		selectFields = append(selectFields, field)
618 703
 	}
@@ -665,3 +750,15 @@ func GetLatestInspectionValues(org_id int64, yearMonth string) ([]map[string]int
665 750
 
666 751
 	return results, nil
667 752
 }
753
+
754
+func createDynamicStruct(fields map[string]interface{}) reflect.Type {
755
+	var structFields []reflect.StructField
756
+	for name, value := range fields {
757
+		structFields = append(structFields, reflect.StructField{
758
+			Name: strings.Title(name),
759
+			Type: reflect.TypeOf(value),
760
+			Tag:  reflect.StructTag(fmt.Sprintf(`json:"%s"`, name)),
761
+		})
762
+	}
763
+	return reflect.StructOf(structFields)
764
+}