Ver código fonte

提交代码

陈少旭 9 meses atrás
pai
commit
19a5469458
2 arquivos alterados com 1012 adições e 118 exclusões
  1. 724 31
      controllers/statistics_api_controller.go
  2. 288 87
      service/statistis_qc_service.go

+ 724 - 31
controllers/statistics_api_controller.go Ver arquivo

@@ -292,39 +292,732 @@ func (c *StatisticsApiController) GetDialysisTotalDetail() {
292 292
 	mode, _ := c.GetInt64("mode")
293 293
 	origin, _ := c.GetInt64("origin")
294 294
 	time_way, _ := c.GetInt64("time_way")
295
-	timeLayout := "2006-01-02"
296
-	loc, _ := time.LoadLocation("Local")
297
-	var startTime int64
298
-	if len(start_date) > 0 {
299
-		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_date+" 00:00:00", loc)
300
-		fmt.Println("err-----------", err)
301
-		if err != nil {
302
-			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
303
-			return
304
-		}
305
-		startTime = theTime.Unix()
306
-	}
307
-	var endTime int64
308
-	if len(end_date) > 0 {
309
-		theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_date+" 23:59:59", loc)
310
-		if err != nil {
311
-			utils.ErrorLog(err.Error())
312
-			c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
313
-			return
314
-		}
315
-		endTime = theTime.Unix()
295
+	//timeLayout := "2006-01-02"
296
+	//loc, _ := time.LoadLocation("Local")
297
+	//var startTime int64
298
+	//if len(start_date) > 0 {
299
+	//	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_date+" 00:00:00", loc)
300
+	//	fmt.Println("err-----------", err)
301
+	//	if err != nil {
302
+	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
303
+	//		return
304
+	//	}
305
+	//	//startTime = theTime.Unix()
306
+	//}
307
+	//var endTime int64
308
+	//if len(end_date) > 0 {
309
+	//	theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_date+" 23:59:59", loc)
310
+	//	if err != nil {
311
+	//		utils.ErrorLog(err.Error())
312
+	//		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
313
+	//		return
314
+	//	}
315
+	//	//endTime = theTime.Unix()
316
+	//}
317
+	dates, err := splitDateRange(start_date, end_date)
318
+	if err != nil {
319
+		fmt.Println("Error:", err)
320
+		return
316 321
 	}
317 322
 
318 323
 	if origin == 1 {
319
-		data, _ := service.GetDialysisStats(startTime, endTime, time_way, mode)
320
-		c.ServeSuccessJSON(map[string]interface{}{
321
-			"data": data,
322
-		})
324
+		switch time_way {
325
+		case 2:
326
+			weeks := groupByWeek(dates)
327
+			//var uniqueFields []map[string]interface{}
328
+			var uniqueFields []map[string]interface{}
329
+
330
+			for _, week := range weeks {
331
+				// 解析字符串时显式指定时区为 UTC
332
+				t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", week[0].String())
333
+				if err != nil {
334
+					fmt.Println("解析时间出错:", err)
335
+					return
336
+				}
337
+				// 解析字符串时显式指定时区为 UTC
338
+				t2, err := time.Parse("2006-01-02 15:04:05 -0700 MST", week[len(week)-1].String())
339
+				if err != nil {
340
+					fmt.Println("解析时间出错:", err)
341
+					return
342
+				}
343
+				//dynamicFields := make([]map[string]interface{}, 0)
344
+				list, _ := service.GetDialysisStats(t.Unix(), t2.Unix(), mode, c.GetAdminUserInfo().CurrentOrgId, time_way)
345
+				//fmt.Println(aa)
346
+				var dynamicFields []map[string]interface{}
347
+				//var uniqueFields []map[string]interface{}
348
+
349
+				for _, result := range list {
350
+					// 打印患者ID
351
+					nb := result["日期"].([]byte)
352
+					name := string(nb)
353
+
354
+					// 创建动态字段的map
355
+					dynamicField := make(map[string]interface{})
356
+					// 将日期放在首位
357
+					dynamicField["日期"] = name
358
+
359
+					// 打印其他列的值,并添加到动态字段中
360
+					for columnName, columnValue := range result {
361
+						if columnName == "日期" {
362
+							continue
363
+						}
364
+						if columnName == "合计" {
365
+							continue
366
+						}
367
+						if columnValue == nil {
368
+							dynamicField[columnName] = ""
369
+							continue
370
+						}
371
+
372
+						byteValue, ok := columnValue.([]byte)
373
+						if !ok {
374
+							fmt.Printf("Error: Unable to convert value for column %s to []byte\n", columnName)
375
+							continue
376
+						}
377
+
378
+						strValue := string(byteValue)
379
+
380
+						floatValue, err := strconv.ParseFloat(strValue, 64)
381
+						if err != nil {
382
+							fmt.Printf("Error converting value for column %s: %v\n", columnName, err)
383
+						} else {
384
+							if floatValue == 0 {
385
+								dynamicField[columnName] = ""
386
+							} else {
387
+								dynamicField[columnName] = floatValue
388
+							}
389
+						}
390
+					}
391
+
392
+					// 将合计放在末尾
393
+					hj := result["合计"].(int64)
394
+					dynamicField["合计"] = hj
395
+
396
+					dynamicFields = append(dynamicFields, dynamicField)
397
+				}
398
+
399
+				// 将日期放在首位
400
+				seen := make(map[interface{}]struct{})
401
+				for _, field := range dynamicFields {
402
+					value := field["日期"]
403
+					if _, ok := seen[value]; !ok {
404
+						seen[value] = struct{}{}
405
+						uniqueFields = append(uniqueFields, field)
406
+					}
407
+				}
408
+			}
409
+			c.ServeSuccessJSON(map[string]interface{}{
410
+				"list": uniqueFields,
411
+			})
412
+
413
+			break
414
+		case 1:
415
+			startDate, err := time.Parse("2006-01-02", start_date)
416
+			if err != nil {
417
+				fmt.Println("Error parsing start date:", err)
418
+				return
419
+			}
420
+
421
+			endDate, err := time.Parse("2006-01-02", end_date)
422
+			if err != nil {
423
+				fmt.Println("Error parsing end date:", err)
424
+				return
425
+			}
426
+			dailyDates := splitByDay(startDate, endDate)
427
+			var uniqueFields []map[string]interface{}
428
+			for _, date := range dailyDates {
429
+				list, _ := service.GetDialysisStats(date.Unix(), date.Unix(), mode, c.GetAdminUserInfo().CurrentOrgId, time_way)
430
+				//fmt.Println(aa)
431
+				var dynamicFields []map[string]interface{}
432
+
433
+				for _, result := range list {
434
+					// 打印患者ID
435
+					nb := result["日期"].([]byte)
436
+					name := string(nb)
437
+
438
+					// 创建动态字段的map
439
+					dynamicField := make(map[string]interface{})
440
+					// 将日期放在首位
441
+					dynamicField["日期"] = name
442
+
443
+					// 打印其他列的值,并添加到动态字段中
444
+					for columnName, columnValue := range result {
445
+						if columnName == "日期" {
446
+							continue
447
+						}
448
+						if columnName == "合计" {
449
+							continue
450
+						}
451
+						if columnValue == nil {
452
+							dynamicField[columnName] = ""
453
+							continue
454
+						}
455
+
456
+						byteValue, ok := columnValue.([]byte)
457
+						if !ok {
458
+							fmt.Printf("Error: Unable to convert value for column %s to []byte\n", columnName)
459
+							continue
460
+						}
461
+
462
+						strValue := string(byteValue)
463
+
464
+						floatValue, err := strconv.ParseFloat(strValue, 64)
465
+						if err != nil {
466
+							fmt.Printf("Error converting value for column %s: %v\n", columnName, err)
467
+						} else {
468
+							if floatValue == 0 {
469
+								dynamicField[columnName] = ""
470
+							} else {
471
+								dynamicField[columnName] = floatValue
472
+							}
473
+						}
474
+					}
475
+
476
+					// 将合计放在末尾
477
+					hj := result["合计"].(int64)
478
+					dynamicField["合计"] = hj
479
+
480
+					dynamicFields = append(dynamicFields, dynamicField)
481
+				}
482
+
483
+				// 将日期放在首位
484
+				seen := make(map[interface{}]struct{})
485
+				for _, field := range dynamicFields {
486
+					value := field["日期"]
487
+					if _, ok := seen[value]; !ok {
488
+						seen[value] = struct{}{}
489
+						uniqueFields = append(uniqueFields, field)
490
+					}
491
+				}
492
+			}
493
+			c.ServeSuccessJSON(map[string]interface{}{
494
+				"list": uniqueFields,
495
+			})
496
+
497
+			break
498
+		case 3:
499
+			months := groupByMonth(dates)
500
+			var uniqueFields []map[string]interface{}
501
+			for _, month := range months {
502
+				// 解析字符串时显式指定时区为 UTC
503
+				t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", month[0].String())
504
+				if err != nil {
505
+					fmt.Println("解析时间出错:", err)
506
+					return
507
+				}
508
+				// 解析字符串时显式指定时区为 UTC
509
+				t2, err := time.Parse("2006-01-02 15:04:05 -0700 MST", month[len(month)-1].String())
510
+				if err != nil {
511
+					fmt.Println("解析时间出错:", err)
512
+					return
513
+				}
514
+				//dynamicFields := make([]map[string]interface{}, 0)
515
+				list, _ := service.GetDialysisStats(t.Unix(), t2.Unix(), mode, c.GetAdminUserInfo().CurrentOrgId, time_way)
516
+				//fmt.Println(aa)
517
+				var dynamicFields []map[string]interface{}
518
+				//var uniqueFields []map[string]interface{}
519
+
520
+				for _, result := range list {
521
+					// 打印患者ID
522
+					nb := result["日期"].([]byte)
523
+					name := string(nb)
524
+
525
+					// 创建动态字段的map
526
+					dynamicField := make(map[string]interface{})
527
+					// 将日期放在首位
528
+					dynamicField["日期"] = name
529
+
530
+					// 打印其他列的值,并添加到动态字段中
531
+					for columnName, columnValue := range result {
532
+						if columnName == "日期" {
533
+							continue
534
+						}
535
+						if columnName == "合计" {
536
+							continue
537
+						}
538
+						if columnValue == nil {
539
+							dynamicField[columnName] = ""
540
+							continue
541
+						}
542
+
543
+						byteValue, ok := columnValue.([]byte)
544
+						if !ok {
545
+							fmt.Printf("Error: Unable to convert value for column %s to []byte\n", columnName)
546
+							continue
547
+						}
548
+
549
+						strValue := string(byteValue)
550
+
551
+						floatValue, err := strconv.ParseFloat(strValue, 64)
552
+						if err != nil {
553
+							fmt.Printf("Error converting value for column %s: %v\n", columnName, err)
554
+						} else {
555
+							if floatValue == 0 {
556
+								dynamicField[columnName] = ""
557
+							} else {
558
+								dynamicField[columnName] = floatValue
559
+							}
560
+						}
561
+					}
562
+
563
+					// 将合计放在末尾
564
+					hj := result["合计"].(int64)
565
+					dynamicField["合计"] = hj
566
+
567
+					dynamicFields = append(dynamicFields, dynamicField)
568
+				}
569
+
570
+				// 将日期放在首位
571
+				seen := make(map[interface{}]struct{})
572
+				for _, field := range dynamicFields {
573
+					value := field["日期"]
574
+					if _, ok := seen[value]; !ok {
575
+						seen[value] = struct{}{}
576
+						uniqueFields = append(uniqueFields, field)
577
+					}
578
+				}
579
+			}
580
+			c.ServeSuccessJSON(map[string]interface{}{
581
+				"list": uniqueFields,
582
+			})
583
+			break
584
+		case 4:
585
+			years := groupByYear(dates)
586
+			var uniqueFields []map[string]interface{}
587
+			for _, year := range years {
588
+				// 解析字符串时显式指定时区为 UTC
589
+				t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", year[0].String())
590
+				if err != nil {
591
+					fmt.Println("解析时间出错:", err)
592
+					return
593
+				}
594
+				// 解析字符串时显式指定时区为 UTC
595
+				t2, err := time.Parse("2006-01-02 15:04:05 -0700 MST", year[len(year)-1].String())
596
+				if err != nil {
597
+					fmt.Println("解析时间出错:", err)
598
+					return
599
+				}
600
+				//dynamicFields := make([]map[string]interface{}, 0)
601
+				list, _ := service.GetDialysisStats(t.Unix(), t2.Unix(), mode, c.GetAdminUserInfo().CurrentOrgId, time_way)
602
+				//fmt.Println(aa)
603
+				var dynamicFields []map[string]interface{}
604
+				//var uniqueFields []map[string]interface{}
605
+
606
+				for _, result := range list {
607
+					// 打印患者ID
608
+					nb := result["日期"].([]byte)
609
+					name := string(nb)
610
+
611
+					// 创建动态字段的map
612
+					dynamicField := make(map[string]interface{})
613
+					// 将日期放在首位
614
+					dynamicField["日期"] = name
615
+
616
+					// 打印其他列的值,并添加到动态字段中
617
+					for columnName, columnValue := range result {
618
+						if columnName == "日期" {
619
+							continue
620
+						}
621
+						if columnName == "合计" {
622
+							continue
623
+						}
624
+						if columnValue == nil {
625
+							dynamicField[columnName] = ""
626
+							continue
627
+						}
628
+
629
+						byteValue, ok := columnValue.([]byte)
630
+						if !ok {
631
+							fmt.Printf("Error: Unable to convert value for column %s to []byte\n", columnName)
632
+							continue
633
+						}
634
+
635
+						strValue := string(byteValue)
636
+
637
+						floatValue, err := strconv.ParseFloat(strValue, 64)
638
+						if err != nil {
639
+							fmt.Printf("Error converting value for column %s: %v\n", columnName, err)
640
+						} else {
641
+							if floatValue == 0 {
642
+								dynamicField[columnName] = ""
643
+							} else {
644
+								dynamicField[columnName] = floatValue
645
+							}
646
+						}
647
+					}
648
+
649
+					// 将合计放在末尾
650
+					hj := result["合计"].(int64)
651
+					dynamicField["合计"] = hj
652
+
653
+					dynamicFields = append(dynamicFields, dynamicField)
654
+				}
655
+
656
+				// 将日期放在首位
657
+				seen := make(map[interface{}]struct{})
658
+				for _, field := range dynamicFields {
659
+					value := field["日期"]
660
+					if _, ok := seen[value]; !ok {
661
+						seen[value] = struct{}{}
662
+						uniqueFields = append(uniqueFields, field)
663
+					}
664
+				}
665
+			}
666
+			c.ServeSuccessJSON(map[string]interface{}{
667
+				"list": uniqueFields,
668
+			})
669
+			break
670
+
671
+		}
672
+
323 673
 	} else {
324
-		data, _ := service.GetScheduleStats(startTime, endTime, time_way, mode)
325
-		c.ServeSuccessJSON(map[string]interface{}{
326
-			"data": data,
327
-		})
674
+		switch time_way {
675
+		case 2:
676
+			weeks := groupByWeek(dates)
677
+			//var uniqueFields []map[string]interface{}
678
+			var uniqueFields []map[string]interface{}
679
+
680
+			for _, week := range weeks {
681
+				// 解析字符串时显式指定时区为 UTC
682
+				t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", week[0].String())
683
+				if err != nil {
684
+					fmt.Println("解析时间出错:", err)
685
+					return
686
+				}
687
+				// 解析字符串时显式指定时区为 UTC
688
+				t2, err := time.Parse("2006-01-02 15:04:05 -0700 MST", week[len(week)-1].String())
689
+				if err != nil {
690
+					fmt.Println("解析时间出错:", err)
691
+					return
692
+				}
693
+				//dynamicFields := make([]map[string]interface{}, 0)
694
+				list, _ := service.GetScheduleStats(t.Unix(), t2.Unix(), mode, c.GetAdminUserInfo().CurrentOrgId, time_way)
695
+				//fmt.Println(aa)
696
+				var dynamicFields []map[string]interface{}
697
+				//var uniqueFields []map[string]interface{}
698
+
699
+				for _, result := range list {
700
+					// 打印患者ID
701
+					nb := result["日期"].([]byte)
702
+					name := string(nb)
703
+
704
+					// 创建动态字段的map
705
+					dynamicField := make(map[string]interface{})
706
+					// 将日期放在首位
707
+					dynamicField["日期"] = name
708
+
709
+					// 打印其他列的值,并添加到动态字段中
710
+					for columnName, columnValue := range result {
711
+						if columnName == "日期" {
712
+							continue
713
+						}
714
+						if columnName == "合计" {
715
+							continue
716
+						}
717
+						if columnValue == nil {
718
+							dynamicField[columnName] = ""
719
+							continue
720
+						}
721
+
722
+						byteValue, ok := columnValue.([]byte)
723
+						if !ok {
724
+							fmt.Printf("Error: Unable to convert value for column %s to []byte\n", columnName)
725
+							continue
726
+						}
727
+
728
+						strValue := string(byteValue)
729
+
730
+						floatValue, err := strconv.ParseFloat(strValue, 64)
731
+						if err != nil {
732
+							fmt.Printf("Error converting value for column %s: %v\n", columnName, err)
733
+						} else {
734
+							if floatValue == 0 {
735
+								dynamicField[columnName] = ""
736
+							} else {
737
+								dynamicField[columnName] = floatValue
738
+							}
739
+						}
740
+					}
741
+
742
+					// 将合计放在末尾
743
+					hj := result["合计"].(int64)
744
+					dynamicField["合计"] = hj
745
+
746
+					dynamicFields = append(dynamicFields, dynamicField)
747
+				}
748
+
749
+				// 将日期放在首位
750
+				seen := make(map[interface{}]struct{})
751
+				for _, field := range dynamicFields {
752
+					value := field["日期"]
753
+					if _, ok := seen[value]; !ok {
754
+						seen[value] = struct{}{}
755
+						uniqueFields = append(uniqueFields, field)
756
+					}
757
+				}
758
+			}
759
+			c.ServeSuccessJSON(map[string]interface{}{
760
+				"list": uniqueFields,
761
+			})
762
+
763
+			break
764
+		case 1:
765
+			startDate, err := time.Parse("2006-01-02", start_date)
766
+			if err != nil {
767
+				fmt.Println("Error parsing start date:", err)
768
+				return
769
+			}
770
+
771
+			endDate, err := time.Parse("2006-01-02", end_date)
772
+			if err != nil {
773
+				fmt.Println("Error parsing end date:", err)
774
+				return
775
+			}
776
+			dailyDates := splitByDay(startDate, endDate)
777
+			var uniqueFields []map[string]interface{}
778
+			for _, date := range dailyDates {
779
+				list, _ := service.GetScheduleStats(date.Unix(), date.Unix(), mode, c.GetAdminUserInfo().CurrentOrgId, time_way)
780
+				//fmt.Println(aa)
781
+				var dynamicFields []map[string]interface{}
782
+
783
+				for _, result := range list {
784
+					// 打印患者ID
785
+					nb := result["日期"].([]byte)
786
+					name := string(nb)
787
+
788
+					// 创建动态字段的map
789
+					dynamicField := make(map[string]interface{})
790
+					// 将日期放在首位
791
+					dynamicField["日期"] = name
792
+
793
+					// 打印其他列的值,并添加到动态字段中
794
+					for columnName, columnValue := range result {
795
+						if columnName == "日期" {
796
+							continue
797
+						}
798
+						if columnName == "合计" {
799
+							continue
800
+						}
801
+						if columnValue == nil {
802
+							dynamicField[columnName] = ""
803
+							continue
804
+						}
805
+
806
+						byteValue, ok := columnValue.([]byte)
807
+						if !ok {
808
+							fmt.Printf("Error: Unable to convert value for column %s to []byte\n", columnName)
809
+							continue
810
+						}
811
+
812
+						strValue := string(byteValue)
813
+
814
+						floatValue, err := strconv.ParseFloat(strValue, 64)
815
+						if err != nil {
816
+							fmt.Printf("Error converting value for column %s: %v\n", columnName, err)
817
+						} else {
818
+							if floatValue == 0 {
819
+								dynamicField[columnName] = ""
820
+							} else {
821
+								dynamicField[columnName] = floatValue
822
+							}
823
+						}
824
+					}
825
+
826
+					// 将合计放在末尾
827
+					hj := result["合计"].(int64)
828
+					dynamicField["合计"] = hj
829
+
830
+					dynamicFields = append(dynamicFields, dynamicField)
831
+				}
832
+
833
+				// 将日期放在首位
834
+				seen := make(map[interface{}]struct{})
835
+				for _, field := range dynamicFields {
836
+					value := field["日期"]
837
+					if _, ok := seen[value]; !ok {
838
+						seen[value] = struct{}{}
839
+						uniqueFields = append(uniqueFields, field)
840
+					}
841
+				}
842
+			}
843
+			c.ServeSuccessJSON(map[string]interface{}{
844
+				"list": uniqueFields,
845
+			})
846
+
847
+			break
848
+		case 3:
849
+			months := groupByMonth(dates)
850
+			var uniqueFields []map[string]interface{}
851
+			for _, month := range months {
852
+				// 解析字符串时显式指定时区为 UTC
853
+				t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", month[0].String())
854
+				if err != nil {
855
+					fmt.Println("解析时间出错:", err)
856
+					return
857
+				}
858
+				// 解析字符串时显式指定时区为 UTC
859
+				t2, err := time.Parse("2006-01-02 15:04:05 -0700 MST", month[len(month)-1].String())
860
+				if err != nil {
861
+					fmt.Println("解析时间出错:", err)
862
+					return
863
+				}
864
+				//dynamicFields := make([]map[string]interface{}, 0)
865
+				list, _ := service.GetScheduleStats(t.Unix(), t2.Unix(), mode, c.GetAdminUserInfo().CurrentOrgId, time_way)
866
+				//fmt.Println(aa)
867
+				var dynamicFields []map[string]interface{}
868
+				//var uniqueFields []map[string]interface{}
869
+
870
+				for _, result := range list {
871
+					// 打印患者ID
872
+					nb := result["日期"].([]byte)
873
+					name := string(nb)
874
+
875
+					// 创建动态字段的map
876
+					dynamicField := make(map[string]interface{})
877
+					// 将日期放在首位
878
+					dynamicField["日期"] = name
879
+
880
+					// 打印其他列的值,并添加到动态字段中
881
+					for columnName, columnValue := range result {
882
+						if columnName == "日期" {
883
+							continue
884
+						}
885
+						if columnName == "合计" {
886
+							continue
887
+						}
888
+						if columnValue == nil {
889
+							dynamicField[columnName] = ""
890
+							continue
891
+						}
892
+
893
+						byteValue, ok := columnValue.([]byte)
894
+						if !ok {
895
+							fmt.Printf("Error: Unable to convert value for column %s to []byte\n", columnName)
896
+							continue
897
+						}
898
+
899
+						strValue := string(byteValue)
900
+
901
+						floatValue, err := strconv.ParseFloat(strValue, 64)
902
+						if err != nil {
903
+							fmt.Printf("Error converting value for column %s: %v\n", columnName, err)
904
+						} else {
905
+							if floatValue == 0 {
906
+								dynamicField[columnName] = ""
907
+							} else {
908
+								dynamicField[columnName] = floatValue
909
+							}
910
+						}
911
+					}
912
+
913
+					// 将合计放在末尾
914
+					hj := result["合计"].(int64)
915
+					dynamicField["合计"] = hj
916
+
917
+					dynamicFields = append(dynamicFields, dynamicField)
918
+				}
919
+
920
+				// 将日期放在首位
921
+				seen := make(map[interface{}]struct{})
922
+				for _, field := range dynamicFields {
923
+					value := field["日期"]
924
+					if _, ok := seen[value]; !ok {
925
+						seen[value] = struct{}{}
926
+						uniqueFields = append(uniqueFields, field)
927
+					}
928
+				}
929
+			}
930
+			c.ServeSuccessJSON(map[string]interface{}{
931
+				"list": uniqueFields,
932
+			})
933
+			break
934
+		case 4:
935
+			years := groupByYear(dates)
936
+			var uniqueFields []map[string]interface{}
937
+			for _, year := range years {
938
+				// 解析字符串时显式指定时区为 UTC
939
+				t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", year[0].String())
940
+				if err != nil {
941
+					fmt.Println("解析时间出错:", err)
942
+					return
943
+				}
944
+				// 解析字符串时显式指定时区为 UTC
945
+				t2, err := time.Parse("2006-01-02 15:04:05 -0700 MST", year[len(year)-1].String())
946
+				if err != nil {
947
+					fmt.Println("解析时间出错:", err)
948
+					return
949
+				}
950
+				//dynamicFields := make([]map[string]interface{}, 0)
951
+				list, _ := service.GetScheduleStats(t.Unix(), t2.Unix(), mode, c.GetAdminUserInfo().CurrentOrgId, time_way)
952
+				//fmt.Println(aa)
953
+				var dynamicFields []map[string]interface{}
954
+				//var uniqueFields []map[string]interface{}
955
+
956
+				for _, result := range list {
957
+					// 打印患者ID
958
+					nb := result["日期"].([]byte)
959
+					name := string(nb)
960
+
961
+					// 创建动态字段的map
962
+					dynamicField := make(map[string]interface{})
963
+					// 将日期放在首位
964
+					dynamicField["日期"] = name
965
+
966
+					// 打印其他列的值,并添加到动态字段中
967
+					for columnName, columnValue := range result {
968
+						if columnName == "日期" {
969
+							continue
970
+						}
971
+						if columnName == "合计" {
972
+							continue
973
+						}
974
+						if columnValue == nil {
975
+							dynamicField[columnName] = ""
976
+							continue
977
+						}
978
+
979
+						byteValue, ok := columnValue.([]byte)
980
+						if !ok {
981
+							fmt.Printf("Error: Unable to convert value for column %s to []byte\n", columnName)
982
+							continue
983
+						}
984
+
985
+						strValue := string(byteValue)
986
+
987
+						floatValue, err := strconv.ParseFloat(strValue, 64)
988
+						if err != nil {
989
+							fmt.Printf("Error converting value for column %s: %v\n", columnName, err)
990
+						} else {
991
+							if floatValue == 0 {
992
+								dynamicField[columnName] = ""
993
+							} else {
994
+								dynamicField[columnName] = floatValue
995
+							}
996
+						}
997
+					}
998
+
999
+					// 将合计放在末尾
1000
+					hj := result["合计"].(int64)
1001
+					dynamicField["合计"] = hj
1002
+
1003
+					dynamicFields = append(dynamicFields, dynamicField)
1004
+				}
1005
+
1006
+				// 将日期放在首位
1007
+				seen := make(map[interface{}]struct{})
1008
+				for _, field := range dynamicFields {
1009
+					value := field["日期"]
1010
+					if _, ok := seen[value]; !ok {
1011
+						seen[value] = struct{}{}
1012
+						uniqueFields = append(uniqueFields, field)
1013
+					}
1014
+				}
1015
+			}
1016
+			c.ServeSuccessJSON(map[string]interface{}{
1017
+				"list": uniqueFields,
1018
+			})
1019
+			break
1020
+		}
328 1021
 	}
329 1022
 }
330 1023
 func (c *StatisticsApiController) GetDialysisTotalDetailInfo() {
@@ -597,8 +1290,8 @@ func (c *StatisticsApiController) GetAllCommonInspectionStatistisc() {
597 1290
 
598 1291
 }
599 1292
 func (c *StatisticsApiController) GetPersonCommonInspectionStatistisc() {
600
-	start_date := c.GetString("start_time")
601
-	end_date := c.GetString("end_time")
1293
+	start_date := c.GetString("start_date")
1294
+	end_date := c.GetString("end_date")
602 1295
 	project_id, _ := c.GetInt64("project_id")
603 1296
 	item_id, _ := c.GetInt64("item_id")
604 1297
 	patient_id, _ := c.GetInt64("patient_id")

+ 288 - 87
service/statistis_qc_service.go Ver arquivo

@@ -2,6 +2,7 @@ package service
2 2
 
3 3
 import (
4 4
 	"XT_New/models"
5
+	"database/sql"
5 6
 	"fmt"
6 7
 	"reflect"
7 8
 	"strings"
@@ -47,23 +48,37 @@ type DialysisStat struct {
47 48
 	Total  int            `json:"合计"`
48 49
 }
49 50
 
50
-func getTreatmentModes() ([]TreatmentMode, error) {
51
-	var modes []TreatmentMode
52
-	if err := XTReadDB().Find(&modes).Error; err != nil {
51
+func GetTreatmentModes() ([]models.TreatmentMode, error) {
52
+	var modes []models.TreatmentMode
53
+	if err := XTReadDB().Model(&models.TreatmentMode{}).Find(&modes).Error; err != nil {
53 54
 		return nil, err
54 55
 	}
55 56
 	return modes, nil
56 57
 }
57 58
 
58
-func GetDialysisStats(startDate int64, endDate int64, groupBy int64, mode int64) ([]DialysisStat, error) {
59
-	var stats []DialysisStat
60
-	var modes []TreatmentMode
61
-	if mode > 0 {
62
-		modes, _ = getTreatmentModes()
59
+func GetDialysisStats(start int64, end int64, mode int64, org_id int64, time_way int64) ([]map[string]interface{}, error) {
60
+	// 将时间戳转换为time.Time类型
61
+	t := time.Unix(start, 0)
62
+	// 使用布局定义格式化时间
63
+	layout := "2006-01-02"
64
+	// 将时间格式化为字符串
65
+	startDate := t.Format(layout) + " 00:00:00"
66
+
67
+	t2 := time.Unix(end, 0)
68
+	// 使用布局定义格式化时间
69
+	//layout := "2006-01-02"
70
+	// 将时间格式化为字符串
71
+	endDate := t2.Format(layout) + " 00:00:00"
72
+	//var stats []DialysisStat
73
+	var modes []models.TreatmentMode
74
+	fmt.Println(mode)
75
+	if mode == 0 {
76
+		modes, _ = GetTreatmentModes()
77
+
63 78
 	} else {
64
-		modes_two, _ := getTreatmentModes()
79
+		modes_two, _ := GetTreatmentModes()
65 80
 		for _, item := range modes_two {
66
-			if item.ModeID == int(mode) {
81
+			if item.ModeID == mode {
67 82
 				modes = append(modes, item)
68 83
 			}
69 84
 		}
@@ -73,28 +88,43 @@ func GetDialysisStats(startDate int64, endDate int64, groupBy int64, mode int64)
73 88
 		return nil, err
74 89
 	}
75 90
 
76
-	// 构建日期格式
77
-	dateFormat := "%Y-%m-%d"
78
-	switch groupBy {
79
-	case 2:
80
-		dateFormat = "%Y-%m-%d"
81
-	case 1:
82
-		dateFormat = "%Y-%u"
83
-	case 3:
84
-		dateFormat = "%Y-%m"
85
-	case 4:
86
-		dateFormat = "%Y"
87
-	default:
88
-		return nil, fmt.Errorf("invalid group by option")
89
-	}
91
+	var selectClauses []string
90 92
 	// 构建动态查询语句
91
-	selectClauses := []string{fmt.Sprintf("DATE_FORMAT(p.record_date, '%s') AS `日期`", dateFormat)}
93
+	if time_way == 1 {
94
+		selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0])}
95
+	} else if time_way == 3 {
96
+		selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0]+"-"+strings.Split(strings.Split(startDate, " ")[0], "-")[1])}
97
+	} else if time_way == 4 {
98
+		selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0])}
99
+	} else {
100
+		selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
101
+	}
92 102
 	for _, mode := range modes {
93
-		selectClauses = append(selectClauses, fmt.Sprintf("SUM(CASE WHEN t.mode_name = '%s' THEN 1 ELSE 0 END) AS `%s`", mode.ModeName, mode.ModeName))
103
+		fmt.Println(mode)
104
+
105
+		selectClauses = append(selectClauses, fmt.Sprintf("COALESCE(SUM(CASE WHEN t.name = '%s' THEN 1 ELSE 0 END), 0) AS `%s`", mode.Name, mode.Name))
94 106
 	}
95 107
 	selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
96 108
 
97
-	query := fmt.Sprintf(`
109
+	var rows *sql.Rows
110
+	var query string
111
+	if mode > 0 {
112
+		query = fmt.Sprintf(`
113
+        SELECT
114
+            %s
115
+        FROM
116
+            xt_dialysis_prescription p
117
+        JOIN
118
+            xt_treatment_mode t ON p.mode_id = t.mode_id
119
+        WHERE
120
+            FROM_UNIXTIME(p.record_date) >= ? AND FROM_UNIXTIME(p.record_date) <= ? AND p.user_org_id = ? and p.mode_id = ?
121
+        GROUP BY
122
+           日期
123
+    `, strings.Join(selectClauses, ", "))
124
+		rows, _ = readDb.Raw(query, startDate, endDate, org_id, mode).Rows()
125
+
126
+	} else {
127
+		query = fmt.Sprintf(`
98 128
         SELECT
99 129
             %s
100 130
         FROM
@@ -102,48 +132,93 @@ func GetDialysisStats(startDate int64, endDate int64, groupBy int64, mode int64)
102 132
         JOIN
103 133
             xt_treatment_mode t ON p.mode_id = t.mode_id
104 134
         WHERE
105
-            p.record_date >= ? AND p.record_date <= ?
135
+            FROM_UNIXTIME(p.record_date) >= ? AND FROM_UNIXTIME(p.record_date) <= ? AND p.user_org_id = ? 
106 136
         GROUP BY
107
-            DATE_FORMAT(p.record_date, '%s')
108
-    `, dateFormat, dateFormat, selectClauses)
137
+           日期
138
+    `, strings.Join(selectClauses, ", "))
139
+		rows, _ = readDb.Raw(query, startDate, endDate, org_id).Rows()
140
+	}
109 141
 
110
-	rows, err := readDb.Raw(query, startDate, endDate).Rows()
111 142
 	if err != nil {
112 143
 		return nil, err
113 144
 	}
114 145
 	defer rows.Close()
115 146
 
116
-	// 解析查询结果
147
+	columns, err := rows.Columns()
148
+	if err != nil {
149
+		return nil, err
150
+	}
151
+
152
+	var results []map[string]interface{}
153
+
117 154
 	for rows.Next() {
118
-		var stat DialysisStat
119
-		stat.Counts = make(map[string]int)
120
-		cols := []interface{}{&stat.Date}
121
-		for _, mode := range modes {
122
-			var count int
123
-			cols = append(cols, &count)
124
-			stat.Counts[mode.ModeName] = count
155
+		// 创建一个长度为列数的切片,用于存储每一行的值
156
+		columnValues := make([]interface{}, len(columns))
157
+		columnPointers := make([]interface{}, len(columns))
158
+		for i := range columnValues {
159
+			columnPointers[i] = &columnValues[i]
125 160
 		}
126
-		var total int
127
-		cols = append(cols, &total)
128
-		stat.Total = total
129
-		if err := rows.Scan(cols...); err != nil {
161
+
162
+		// 扫描当前行的值
163
+		if err := rows.Scan(columnPointers...); err != nil {
130 164
 			return nil, err
131 165
 		}
132
-		stats = append(stats, stat)
166
+
167
+		// 将扫描到的值放入结果 map 中
168
+		result := make(map[string]interface{})
169
+		for i, colName := range columns {
170
+			val := columnPointers[i].(*interface{})
171
+			result[colName] = *val
172
+		}
173
+
174
+		results = append(results, result)
133 175
 	}
134 176
 
135
-	return stats, nil
177
+	//// 解析查询结果
178
+	//for rows.Next() {
179
+	//	var stat DialysisStat
180
+	//	stat.Counts = make(map[string]int)
181
+	//	cols := []interface{}{&stat.Date}
182
+	//	for _, mode := range modes {
183
+	//		var count int
184
+	//		cols = append(cols, &count)
185
+	//		stat.Counts[mode.Name] = count
186
+	//	}
187
+	//	var total int
188
+	//	cols = append(cols, &total)
189
+	//	stat.Total = total
190
+	//	if err := rows.Scan(cols...); err != nil {
191
+	//		return nil, err
192
+	//	}
193
+	//	stats = append(stats, stat)
194
+	//}
195
+
196
+	return results, nil
136 197
 }
137 198
 
138
-func GetScheduleStats(startDate int64, endDate int64, groupBy int64, mode int64) ([]DialysisStat, error) {
139
-	var stats []DialysisStat
140
-	var modes []TreatmentMode
141
-	if mode > 0 {
142
-		modes, _ = getTreatmentModes()
199
+func GetScheduleStats(start int64, end int64, mode int64, org_id int64, time_way int64) ([]map[string]interface{}, error) {
200
+	// 将时间戳转换为time.Time类型
201
+	t := time.Unix(start, 0)
202
+	// 使用布局定义格式化时间
203
+	layout := "2006-01-02"
204
+	// 将时间格式化为字符串
205
+	startDate := t.Format(layout) + " 00:00:00"
206
+
207
+	t2 := time.Unix(end, 0)
208
+	// 使用布局定义格式化时间
209
+	//layout := "2006-01-02"
210
+	// 将时间格式化为字符串
211
+	endDate := t2.Format(layout) + " 00:00:00"
212
+	//var stats []DialysisStat
213
+	var modes []models.TreatmentMode
214
+	fmt.Println(mode)
215
+	if mode == 0 {
216
+		modes, _ = GetTreatmentModes()
217
+
143 218
 	} else {
144
-		modes_two, _ := getTreatmentModes()
219
+		modes_two, _ := GetTreatmentModes()
145 220
 		for _, item := range modes_two {
146
-			if item.ModeID == int(mode) {
221
+			if item.ModeID == mode {
147 222
 				modes = append(modes, item)
148 223
 			}
149 224
 		}
@@ -153,28 +228,28 @@ func GetScheduleStats(startDate int64, endDate int64, groupBy int64, mode int64)
153 228
 		return nil, err
154 229
 	}
155 230
 
156
-	// 构建日期格式
157
-	dateFormat := "%Y-%m-%d"
158
-	switch groupBy {
159
-	case 2:
160
-		dateFormat = "%Y-%m-%d"
161
-	case 1:
162
-		dateFormat = "%Y-%u"
163
-	case 3:
164
-		dateFormat = "%Y-%m"
165
-	case 4:
166
-		dateFormat = "%Y"
167
-	default:
168
-		return nil, fmt.Errorf("invalid group by option")
169
-	}
231
+	var selectClauses []string
170 232
 	// 构建动态查询语句
171
-	selectClauses := []string{fmt.Sprintf("DATE_FORMAT(p.schudle_date, '%s') AS `日期`", dateFormat)}
233
+	if time_way == 1 {
234
+		selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0])}
235
+	} else if time_way == 3 {
236
+		selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0]+strings.Split(strings.Split(startDate, " ")[0], "-")[1])}
237
+	} else if time_way == 4 {
238
+		selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(strings.Split(startDate, " ")[0], "-")[0])}
239
+	} else {
240
+		selectClauses = []string{fmt.Sprintf("'%s' AS `日期`", strings.Split(startDate, " ")[0]+"~"+strings.Split(endDate, " ")[0])}
241
+	}
172 242
 	for _, mode := range modes {
173
-		selectClauses = append(selectClauses, fmt.Sprintf("SUM(CASE WHEN t.mode_name = '%s' THEN 1 ELSE 0 END) AS `%s`", mode.ModeName, mode.ModeName))
243
+		fmt.Println(mode)
244
+
245
+		selectClauses = append(selectClauses, fmt.Sprintf("COALESCE(SUM(CASE WHEN t.name = '%s' THEN 1 ELSE 0 END), 0) AS `%s`", mode.Name, mode.Name))
174 246
 	}
175 247
 	selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
176 248
 
177
-	query := fmt.Sprintf(`
249
+	var rows *sql.Rows
250
+	var query string
251
+	if mode > 0 {
252
+		query = fmt.Sprintf(`
178 253
         SELECT
179 254
             %s
180 255
         FROM
@@ -182,39 +257,165 @@ func GetScheduleStats(startDate int64, endDate int64, groupBy int64, mode int64)
182 257
         JOIN
183 258
             xt_treatment_mode t ON p.mode_id = t.mode_id
184 259
         WHERE
185
-            p.schedule_date >= ? AND p.schedule_date <= ?
260
+            FROM_UNIXTIME(p.schedule_date) >= ? AND FROM_UNIXTIME(p.schedule_date) <= ? AND p.user_org_id = ? and p.mode_id = ?
186 261
         GROUP BY
187
-            DATE_FORMAT(p.schedule_date, '%s')
188
-    `, dateFormat, dateFormat, selectClauses)
262
+           日期
263
+    `, strings.Join(selectClauses, ", "))
264
+		rows, _ = readDb.Raw(query, startDate, endDate, org_id, mode).Rows()
265
+
266
+	} else {
267
+		query = fmt.Sprintf(`
268
+        SELECT
269
+            %s
270
+        FROM
271
+            xt_schedule p
272
+        JOIN
273
+            xt_treatment_mode t ON p.mode_id = t.mode_id
274
+        WHERE
275
+            FROM_UNIXTIME(p.schedule_date) >= ? AND FROM_UNIXTIME(p.schedule_date) <= ? AND p.user_org_id = ? 
276
+        GROUP BY
277
+           日期
278
+    `, strings.Join(selectClauses, ", "))
279
+		rows, _ = readDb.Raw(query, startDate, endDate, org_id).Rows()
280
+	}
189 281
 
190
-	rows, err := readDb.Raw(query, startDate, endDate).Rows()
191 282
 	if err != nil {
192 283
 		return nil, err
193 284
 	}
194 285
 	defer rows.Close()
195 286
 
196
-	// 解析查询结果
287
+	columns, err := rows.Columns()
288
+	if err != nil {
289
+		return nil, err
290
+	}
291
+
292
+	var results []map[string]interface{}
293
+
197 294
 	for rows.Next() {
198
-		var stat DialysisStat
199
-		stat.Counts = make(map[string]int)
200
-		cols := []interface{}{&stat.Date}
201
-		for _, mode := range modes {
202
-			var count int
203
-			cols = append(cols, &count)
204
-			stat.Counts[mode.ModeName] = count
295
+		// 创建一个长度为列数的切片,用于存储每一行的值
296
+		columnValues := make([]interface{}, len(columns))
297
+		columnPointers := make([]interface{}, len(columns))
298
+		for i := range columnValues {
299
+			columnPointers[i] = &columnValues[i]
205 300
 		}
206
-		var total int
207
-		cols = append(cols, &total)
208
-		stat.Total = total
209
-		if err := rows.Scan(cols...); err != nil {
301
+
302
+		// 扫描当前行的值
303
+		if err := rows.Scan(columnPointers...); err != nil {
210 304
 			return nil, err
211 305
 		}
212
-		stats = append(stats, stat)
306
+
307
+		// 将扫描到的值放入结果 map 中
308
+		result := make(map[string]interface{})
309
+		for i, colName := range columns {
310
+			val := columnPointers[i].(*interface{})
311
+			result[colName] = *val
312
+		}
313
+
314
+		results = append(results, result)
213 315
 	}
214 316
 
215
-	return stats, nil
317
+	//// 解析查询结果
318
+	//for rows.Next() {
319
+	//	var stat DialysisStat
320
+	//	stat.Counts = make(map[string]int)
321
+	//	cols := []interface{}{&stat.Date}
322
+	//	for _, mode := range modes {
323
+	//		var count int
324
+	//		cols = append(cols, &count)
325
+	//		stat.Counts[mode.Name] = count
326
+	//	}
327
+	//	var total int
328
+	//	cols = append(cols, &total)
329
+	//	stat.Total = total
330
+	//	if err := rows.Scan(cols...); err != nil {
331
+	//		return nil, err
332
+	//	}
333
+	//	stats = append(stats, stat)
334
+	//}
335
+
336
+	return results, nil
216 337
 }
217 338
 
339
+//func GetScheduleStats(startDate int64, endDate int64, groupBy int64, mode int64, org_id int64) ([]DialysisStat, error) {
340
+//	var stats []DialysisStat
341
+//	var modes []models.TreatmentMode
342
+//	if mode > 0 {
343
+//		modes, _ = GetTreatmentModes()
344
+//	} else {
345
+//		modes_two, _ := GetTreatmentModes()
346
+//		for _, item := range modes_two {
347
+//			if item.ModeID == mode {
348
+//				modes = append(modes, item)
349
+//			}
350
+//		}
351
+//	}
352
+//	// 获取透析模式
353
+//	if err != nil {
354
+//		return nil, err
355
+//	}
356
+//
357
+//	// 构建日期格式
358
+//	dateFormat := "%Y-%m-%d"
359
+//	switch groupBy {
360
+//	case 2:
361
+//		dateFormat = "%Y-%m-%d"
362
+//	case 1:
363
+//		dateFormat = "%Y-%u"
364
+//	case 3:
365
+//		dateFormat = "%Y-%m"
366
+//	case 4:
367
+//		dateFormat = "%Y"
368
+//	default:
369
+//		return nil, fmt.Errorf("invalid group by option")
370
+//	}
371
+//	// 构建动态查询语句
372
+//	selectClauses := []string{fmt.Sprintf("DATE_FORMAT(p.schudle_date, '%s') AS `日期`", dateFormat)}
373
+//	for _, mode := range modes {
374
+//		selectClauses = append(selectClauses, fmt.Sprintf("SUM(CASE WHEN t.mode_name = '%s' THEN 1 ELSE 0 END) AS `%s`", mode.Name, mode.Name))
375
+//	}
376
+//	selectClauses = append(selectClauses, "COUNT(*) AS `合计`")
377
+//
378
+//	query := fmt.Sprintf(`
379
+//        SELECT
380
+//            %s
381
+//        FROM
382
+//            xt_schedule p
383
+//        JOIN
384
+//            xt_treatment_mode t ON p.mode_id = t.mode_id
385
+//        WHERE
386
+//            p.schedule_date >= ? AND p.schedule_date <= ?
387
+//        GROUP BY
388
+//            DATE_FORMAT(p.schedule_date, '%s')
389
+//    `, dateFormat, dateFormat, selectClauses)
390
+//
391
+//	rows, err := readDb.Raw(query, startDate, endDate).Rows()
392
+//	if err != nil {
393
+//		return nil, err
394
+//	}
395
+//	defer rows.Close()
396
+//
397
+//	// 解析查询结果
398
+//	for rows.Next() {
399
+//		var stat DialysisStat
400
+//		stat.Counts = make(map[string]int)
401
+//		cols := []interface{}{&stat.Date}
402
+//		for _, mode := range modes {
403
+//			var count int
404
+//			cols = append(cols, &count)
405
+//			stat.Counts[mode.Name] = count
406
+//		}
407
+//		var total int
408
+//		cols = append(cols, &total)
409
+//		stat.Total = total
410
+//		if err := rows.Scan(cols...); err != nil {
411
+//			return nil, err
412
+//		}
413
+//		stats = append(stats, stat)
414
+//	}
415
+//
416
+//	return stats, nil
417
+//}
418
+
218 419
 func GetNewDialysisCountMode(starttime int64, endtime int64, orgid int64, origin int64, mode_id int64) (counts []*models.PatientPrescriptionCountStruct, err error) {
219 420
 	if origin == 1 {
220 421