|
@@ -7,6 +7,8 @@ import (
|
|
|
"kpt-pasture/util"
|
|
|
"net/http"
|
|
|
|
|
|
+ "gorm.io/gorm"
|
|
|
+
|
|
|
pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
|
|
|
"gitee.com/xuyiping_admin/pkg/xerr"
|
|
|
)
|
|
@@ -165,6 +167,7 @@ func (s *StoreEntry) CalvingReport(ctx context.Context, req *pasturePb.CalvingRe
|
|
|
}, nil
|
|
|
}
|
|
|
|
|
|
+// DiseaseCureReport 疾病治愈率报告
|
|
|
func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.DiseaseCureRateRequest) (*pasturePb.DiseaseCureRateResponse, error) {
|
|
|
lastDayOfMonth, err := util.GetLastDayOfMonth(req.EndDayTime)
|
|
|
if err != nil {
|
|
@@ -179,56 +182,14 @@ func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.Disea
|
|
|
|
|
|
diseaseCureRateList1 := make([]*pasturePb.DiseaseCureRateList, 0)
|
|
|
diseaseCureRateList2 := make([]*pasturePb.DiseaseCureRateList, 0)
|
|
|
- pref1 := s.DB.Model(new(model.EventCowDisease)).
|
|
|
- Select(
|
|
|
- fmt.Sprint(`DATE_FORMAT(FROM_UNIXTIME(diagnosed_at), '%Y-%m') AS months,`)+
|
|
|
- fmt.Sprintf(`
|
|
|
- diagnose_id as disease_id,
|
|
|
- diagnose_name as disease_name,
|
|
|
- diagnose_operation_id as operation_id,
|
|
|
- diagnose_operation_name as operation_name,
|
|
|
- disease_type,
|
|
|
- COUNT(DISTINCT CASE WHEN health_status = %d THEN cow_id END) AS disease_treatment_count, -- 治疗头数
|
|
|
- COUNT(DISTINCT CASE WHEN health_status = %d AND curable_at > 0 THEN cow_id END) AS disease_cure_count, -- 治愈头数
|
|
|
- COUNT(DISTINCT CASE WHEN diagnosed_result = %d THEN cow_id END) AS disease_count, -- 发病数
|
|
|
- COUNT(DISTINCT CASE WHEN health_status IN (%d, %d) THEN cow_id END) AS die_out_count, -- 死淘数
|
|
|
- COUNT(DISTINCT CASE
|
|
|
- WHEN health_status = %d
|
|
|
- AND TIMESTAMPDIFF(DAY, FROM_UNIXTIME(disease_at), FROM_UNIXTIME(curable_at)) <= 7
|
|
|
- THEN cow_id
|
|
|
- END) AS seven_cure_count, -- 7天内治愈头数
|
|
|
- COUNT(DISTINCT CASE
|
|
|
- WHEN health_status = %d
|
|
|
- AND TIMESTAMPDIFF(DAY, FROM_UNIXTIME(disease_at), FROM_UNIXTIME(curable_at)) <= 14
|
|
|
- THEN cow_id
|
|
|
- END) AS seventeen_cure_count, -- 14天内治愈头数
|
|
|
- COUNT(DISTINCT CASE
|
|
|
- WHEN health_status = %d
|
|
|
- AND TIMESTAMPDIFF(DAY, FROM_UNIXTIME(disease_at), FROM_UNIXTIME(curable_at)) <= 30
|
|
|
- THEN cow_id
|
|
|
- END) AS thirty_cure_count -- 30天内治愈头数
|
|
|
- `, pasturePb.HealthStatus_Treatment, pasturePb.HealthStatus_Curable, pasturePb.IsShow_Ok, pasturePb.HealthStatus_Out,
|
|
|
- pasturePb.HealthStatus_Dead, pasturePb.HealthStatus_Curable, pasturePb.HealthStatus_Curable, pasturePb.HealthStatus_Curable,
|
|
|
- )).
|
|
|
- Where("diagnosed_result = ?", pasturePb.IsShow_Ok).
|
|
|
- Where("diagnosed_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
|
|
|
- if req.CowType > 0 {
|
|
|
- pref1.Where("cow_type = ?", req.CowType)
|
|
|
+ pref1, err := s.query1(ctx, req.CowType, startDayTimeUnix, endDayTimeUnix)
|
|
|
+ if err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+ pref2, err := s.query2(ctx, startDayTimeUnix, endDayTimeUnix)
|
|
|
+ if err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
-
|
|
|
- pref2 := s.DB.Model(new(model.EventCowTreatment)).
|
|
|
- Select(`
|
|
|
- DATE_FORMAT(FROM_UNIXTIME(treatment_at), '%Y-%m') AS months,
|
|
|
- disease_id,
|
|
|
- disease_name,
|
|
|
- disease_type,
|
|
|
- prescription_id,
|
|
|
- prescription_name,
|
|
|
- operation_id,
|
|
|
- operation_name,
|
|
|
- COUNT(DISTINCT cow_id) AS disease_treatment_count`,
|
|
|
- ).Where("treatment_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
|
|
|
-
|
|
|
switch req.AnalysisMethod {
|
|
|
case pasturePb.DiseaseAnalysisMethod_Months:
|
|
|
pref1.Where("diagnosed_at > 0").Group("months").Order("months")
|
|
@@ -243,7 +204,7 @@ func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.Disea
|
|
|
pref1.Where("diagnose_operation_id > 0").Group("diagnose_operation_id").Order("diagnose_operation_id")
|
|
|
pref2.Where("operation_id > 0").Group("operation_id").Order("operation_id")
|
|
|
default:
|
|
|
- return nil, xerr.Custom("请选择统计方式")
|
|
|
+ return nil, xerr.Custom("错误的统计方式")
|
|
|
}
|
|
|
|
|
|
if err = pref1.Find(&diseaseCureRateList1).Error; err != nil {
|
|
@@ -254,37 +215,8 @@ func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.Disea
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
|
- for _, v1 := range diseaseCureRateList1 {
|
|
|
- for _, v2 := range diseaseCureRateList2 {
|
|
|
- switch req.AnalysisMethod {
|
|
|
- case pasturePb.DiseaseAnalysisMethod_Months:
|
|
|
- if v1.Months != v2.Months {
|
|
|
- continue
|
|
|
- }
|
|
|
- v1.DiseaseTreatmentCount = v2.DiseaseTreatmentCount
|
|
|
- case pasturePb.DiseaseAnalysisMethod_Disease_Category:
|
|
|
- if v1.DiseaseType != v2.DiseaseType {
|
|
|
- continue
|
|
|
- }
|
|
|
- v1.DiseaseTreatmentCount = v2.DiseaseTreatmentCount
|
|
|
- case pasturePb.DiseaseAnalysisMethod_Disease:
|
|
|
- if v1.DiseaseId != v2.DiseaseId {
|
|
|
- continue
|
|
|
- }
|
|
|
- v1.DiseaseTreatmentCount = v2.DiseaseTreatmentCount
|
|
|
- case pasturePb.DiseaseAnalysisMethod_Operator:
|
|
|
- if v1.OperationId != v2.OperationId {
|
|
|
- continue
|
|
|
- }
|
|
|
- v1.DiseaseTreatmentCount = v2.DiseaseTreatmentCount
|
|
|
- case pasturePb.DiseaseAnalysisMethod_Prescription:
|
|
|
- if v1.PrescriptionId != v2.PrescriptionId {
|
|
|
- continue
|
|
|
- }
|
|
|
- v1.DiseaseTreatmentCount = v2.DiseaseTreatmentCount
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ // 处理数据
|
|
|
+ processDiseaseCureRateList(diseaseCureRateList1, diseaseCureRateList2, req.AnalysisMethod)
|
|
|
chart := &pasturePb.DiseaseCureRateChart{
|
|
|
Headers: make([]string, 0),
|
|
|
DiseaseCureCount: make([]int32, 0),
|
|
@@ -326,3 +258,117 @@ func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.Disea
|
|
|
},
|
|
|
}, nil
|
|
|
}
|
|
|
+
|
|
|
+func (s *StoreEntry) query1(ctx context.Context, cowType pasturePb.CowType_Kind, startDayTimeUnix, endDayTimeUnix int64) (*gorm.DB, error) {
|
|
|
+ pref := s.DB.Model(new(model.EventCowDisease)).
|
|
|
+ Select(
|
|
|
+ `DATE_FORMAT(FROM_UNIXTIME(diagnosed_at), '%Y-%m') AS months,
|
|
|
+ diagnose_id as disease_id,
|
|
|
+ diagnose_name as disease_name,
|
|
|
+ diagnose_operation_id as operation_id,
|
|
|
+ diagnose_operation_name as operation_name,
|
|
|
+ disease_type,
|
|
|
+ COUNT(DISTINCT CASE WHEN health_status = ? THEN cow_id END) AS disease_treatment_count, -- 治疗头数
|
|
|
+ COUNT(DISTINCT CASE WHEN health_status = ? AND curable_at > 0 THEN cow_id END) AS disease_cure_count, -- 治愈头数
|
|
|
+ COUNT(DISTINCT CASE WHEN diagnosed_result = ? THEN cow_id END) AS disease_count, -- 发病数
|
|
|
+ COUNT(DISTINCT CASE WHEN health_status IN (?, ?) THEN cow_id END) AS die_out_count, -- 死淘数
|
|
|
+ COUNT(DISTINCT CASE
|
|
|
+ WHEN health_status = ?
|
|
|
+ AND TIMESTAMPDIFF(DAY, FROM_UNIXTIME(disease_at), FROM_UNIXTIME(curable_at)) <= 7
|
|
|
+ THEN cow_id
|
|
|
+ END) AS seven_cure_count, -- 7天内治愈头数
|
|
|
+ COUNT(DISTINCT CASE
|
|
|
+ WHEN health_status = ?
|
|
|
+ AND TIMESTAMPDIFF(DAY, FROM_UNIXTIME(disease_at), FROM_UNIXTIME(curable_at)) <= 14
|
|
|
+ THEN cow_id
|
|
|
+ END) AS seventeen_cure_count, -- 14天内治愈头数
|
|
|
+ COUNT(DISTINCT CASE
|
|
|
+ WHEN health_status = ?
|
|
|
+ AND TIMESTAMPDIFF(DAY, FROM_UNIXTIME(disease_at), FROM_UNIXTIME(curable_at)) <= 30
|
|
|
+ THEN cow_id
|
|
|
+ END) AS thirty_cure_count -- 30天内治愈头数
|
|
|
+ `,
|
|
|
+ pasturePb.HealthStatus_Treatment, pasturePb.HealthStatus_Curable, pasturePb.IsShow_Ok, pasturePb.HealthStatus_Out,
|
|
|
+ pasturePb.HealthStatus_Dead, pasturePb.HealthStatus_Curable, pasturePb.HealthStatus_Curable, pasturePb.HealthStatus_Curable,
|
|
|
+ ).
|
|
|
+ Where("diagnosed_result = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("diagnosed_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
|
|
|
+ if cowType > 0 {
|
|
|
+ pref.Where("cow_type = ?", cowType)
|
|
|
+ }
|
|
|
+
|
|
|
+ return pref, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (s *StoreEntry) query2(ctx context.Context, startDayTimeUnix, endDayTimeUnix int64) (*gorm.DB, error) {
|
|
|
+ pref := s.DB.Model(new(model.EventCowTreatment)).
|
|
|
+ Select(`
|
|
|
+ DATE_FORMAT(FROM_UNIXTIME(treatment_at), '%Y-%m') AS months,
|
|
|
+ disease_id,
|
|
|
+ disease_name,
|
|
|
+ disease_type,
|
|
|
+ prescription_id,
|
|
|
+ prescription_name,
|
|
|
+ operation_id,
|
|
|
+ operation_name,
|
|
|
+ COUNT(DISTINCT cow_id) AS disease_treatment_count`,
|
|
|
+ ).Where("treatment_at BETWEEN ? AND ?", startDayTimeUnix, endDayTimeUnix)
|
|
|
+ return pref, nil
|
|
|
+}
|
|
|
+
|
|
|
+// 构建哈希表
|
|
|
+func buildMap(list []*pasturePb.DiseaseCureRateList, method pasturePb.DiseaseAnalysisMethod_Kind) map[interface{}]*pasturePb.DiseaseCureRateList {
|
|
|
+ m := make(map[interface{}]*pasturePb.DiseaseCureRateList)
|
|
|
+ for _, v := range list {
|
|
|
+ var key interface{}
|
|
|
+ switch method {
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Months:
|
|
|
+ key = v.Months
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Disease_Category:
|
|
|
+ key = v.DiseaseType
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Disease:
|
|
|
+ key = v.DiseaseId
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Operator:
|
|
|
+ key = v.OperationId
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Prescription:
|
|
|
+ key = v.PrescriptionId
|
|
|
+ }
|
|
|
+ m[key] = v
|
|
|
+ }
|
|
|
+ return m
|
|
|
+}
|
|
|
+
|
|
|
+// 更新 DiseaseTreatmentCount
|
|
|
+func updateDiseaseTreatmentCount(v1 *pasturePb.DiseaseCureRateList, v2 *pasturePb.DiseaseCureRateList) {
|
|
|
+ v1.DiseaseTreatmentCount = v2.DiseaseTreatmentCount
|
|
|
+}
|
|
|
+
|
|
|
+// 主逻辑
|
|
|
+func processDiseaseCureRateList(diseaseCureRateList1, diseaseCureRateList2 []*pasturePb.DiseaseCureRateList, analysisMethod pasturePb.DiseaseAnalysisMethod_Kind) {
|
|
|
+ if len(diseaseCureRateList1) == 0 || len(diseaseCureRateList2) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ map2 := buildMap(diseaseCureRateList2, analysisMethod)
|
|
|
+ for i := range diseaseCureRateList1 {
|
|
|
+ v1 := diseaseCureRateList1[i]
|
|
|
+ var key interface{}
|
|
|
+ switch analysisMethod {
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Months:
|
|
|
+ key = v1.Months
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Disease_Category:
|
|
|
+ key = v1.DiseaseType
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Disease:
|
|
|
+ key = v1.DiseaseId
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Operator:
|
|
|
+ key = v1.OperationId
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Prescription:
|
|
|
+ key = v1.PrescriptionId
|
|
|
+ default:
|
|
|
+ continue // 处理无效的 AnalysisMethod
|
|
|
+ }
|
|
|
+ if v2, ok := map2[key]; ok {
|
|
|
+ updateDiseaseTreatmentCount(v1, v2)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|