|
@@ -164,3 +164,165 @@ func (s *StoreEntry) CalvingReport(ctx context.Context, req *pasturePb.CalvingRe
|
|
|
},
|
|
|
}, nil
|
|
|
}
|
|
|
+
|
|
|
+func (s *StoreEntry) DiseaseCureReport(ctx context.Context, req *pasturePb.DiseaseCureRateRequest) (*pasturePb.DiseaseCureRateResponse, error) {
|
|
|
+ lastDayOfMonth, err := util.GetLastDayOfMonth(req.EndDayTime)
|
|
|
+ if err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ endDayTimeUnix := util.TimeParseLocalEndUnix(lastDayOfMonth)
|
|
|
+ startDayTimeUnix := util.TimeParseLocalUnix(fmt.Sprintf("%s-01", req.StartDayTime))
|
|
|
+ if startDayTimeUnix == 0 || endDayTimeUnix == 0 || endDayTimeUnix <= startDayTimeUnix {
|
|
|
+ return nil, xerr.Custom("开始时间不能大于结束时间")
|
|
|
+ }
|
|
|
+
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+
|
|
|
+ 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")
|
|
|
+ pref2.Where("treatment_at > 0").Group("months").Order("months")
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Disease_Category:
|
|
|
+ pref1.Where("disease_type > 0").Group("disease_type").Order("disease_type")
|
|
|
+ pref2.Where("disease_type > 0").Group("disease_type").Order("disease_type")
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Disease:
|
|
|
+ pref1.Where("diagnose_id > 0").Group("diagnose_id").Order("diagnose_id")
|
|
|
+ pref2.Where("disease_id > 0").Group("disease_id").Order("disease_id")
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Operator:
|
|
|
+ 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("请选择统计方式")
|
|
|
+ }
|
|
|
+
|
|
|
+ if err = pref1.Find(&diseaseCureRateList1).Error; err != nil {
|
|
|
+ return nil, xerr.WithStack(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err = pref2.Find(&diseaseCureRateList2).Error; err != nil {
|
|
|
+ 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
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ chart := &pasturePb.DiseaseCureRateChart{
|
|
|
+ Headers: make([]string, 0),
|
|
|
+ DiseaseCureCount: make([]int32, 0),
|
|
|
+ DiseaseCureRate: make([]float32, 0),
|
|
|
+ DiseaseCount: make([]int32, 0),
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range diseaseCureRateList1 {
|
|
|
+ switch req.AnalysisMethod {
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Months:
|
|
|
+ v.StatisticMethod = v.Months
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Disease_Category:
|
|
|
+ diseaseTypeMap := s.DiseaseTypeMap()
|
|
|
+ v.StatisticMethod = diseaseTypeMap[v.DiseaseType]
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Disease:
|
|
|
+ v.StatisticMethod = v.DiseaseName
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Operator:
|
|
|
+ v.StatisticMethod = v.OperationName
|
|
|
+ case pasturePb.DiseaseAnalysisMethod_Prescription:
|
|
|
+ v.StatisticMethod = v.PrescriptionName
|
|
|
+ }
|
|
|
+
|
|
|
+ chart.Headers = append(chart.Headers, v.StatisticMethod)
|
|
|
+ chart.DiseaseCureCount = append(chart.DiseaseCureCount, v.DiseaseTreatmentCount)
|
|
|
+ diseaseCureRate := float32(0)
|
|
|
+ if v.DiseaseTreatmentCount > 0 {
|
|
|
+ diseaseCureRate = float32(util.RoundToTwoDecimals(float64(v.DiseaseCureCount) / float64(v.DiseaseCount) * 100))
|
|
|
+ }
|
|
|
+ chart.DiseaseCureRate = append(chart.DiseaseCureRate, diseaseCureRate)
|
|
|
+ chart.DiseaseCount = append(chart.DiseaseCount, v.DiseaseCount)
|
|
|
+ }
|
|
|
+
|
|
|
+ return &pasturePb.DiseaseCureRateResponse{
|
|
|
+ Code: http.StatusOK,
|
|
|
+ Message: "ok",
|
|
|
+ Data: &pasturePb.DiseaseCureRateData{
|
|
|
+ List: diseaseCureRateList1,
|
|
|
+ Chart: chart,
|
|
|
+ },
|
|
|
+ }, nil
|
|
|
+}
|