|
@@ -74,6 +74,10 @@ func (s *StoreEntry) SingleFactorInfantSurvivalRateAnalysis(ctx context.Context,
|
|
|
spcRate = float32(util.RoundToTwoDecimals((float64(v.PregnantCount) / float64(v.TotalCount)) * 100))
|
|
|
}
|
|
|
v.SpceRate = spcRate
|
|
|
+ ci95Min, ci95Max := util.ConfidenceInterval2(pregnantRate, float64(v.TotalCount))
|
|
|
+ v.Ci95 = fmt.Sprintf("%d ~ %d", int32(ci95Min), int32(ci95Max))
|
|
|
+ chart.MaxValue = append(chart.MaxValue, int32(ci95Max))
|
|
|
+ chart.MinValue = append(chart.MinValue, int32(ci95Min))
|
|
|
totalCountMap[i] = v.TotalCount
|
|
|
allTotalCount += v.TotalCount
|
|
|
allPregnantRate += pregnantRate
|
|
@@ -550,8 +554,41 @@ func (s *StoreEntry) MultipleFactorAnalysis(ctx context.Context, req *pasturePb.
|
|
|
}
|
|
|
|
|
|
pref := s.DB.Model(new(model.EventMating)).
|
|
|
+ Select(`
|
|
|
+ DATE_FORMAT(FROM_UNIXTIME(reality_day), '%Y-%m') AS months,
|
|
|
+ operation_name,frozen_semen_number as bull,lact,mating_times,
|
|
|
+ CASE expose_estrus_type
|
|
|
+ WHEN 1 THEN '脖环揭发'
|
|
|
+ WHEN 2 THEN '脚环/计步器'
|
|
|
+ WHEN 3 THEN '自然发情'
|
|
|
+ WHEN 4 THEN '同期'
|
|
|
+ ELSE '未知'
|
|
|
+ END AS expose_estrus_type,
|
|
|
+ CASE DAYOFWEEK(DATE(FROM_UNIXTIME(reality_day)))
|
|
|
+ WHEN 2 THEN '星期一'
|
|
|
+ WHEN 3 THEN '星期二'
|
|
|
+ WHEN 4 THEN '星期三'
|
|
|
+ WHEN 5 THEN '星期四'
|
|
|
+ WHEN 6 THEN '星期五'
|
|
|
+ WHEN 7 THEN '星期六'
|
|
|
+ WHEN 1 THEN '星期日'
|
|
|
+ ELSE '未知'
|
|
|
+ END AS week,
|
|
|
+ COUNT(DISTINCT CASE WHEN mating_result = ? AND mating_result_at > 0 THEN cow_id END) AS pregnant_count, -- 怀孕头数
|
|
|
+ COUNT(DISTINCT CASE WHEN mating_result = ? AND mating_result_at > 0 THEN cow_id END) AS empty_pregnant_count, -- 空怀头数
|
|
|
+ COUNT(DISTINCT CASE WHEN mating_result = ? AND mating_result_at > 0 THEN cow_id END) AS abortion_count, -- 流产头数
|
|
|
+ COUNT(DISTINCT CASE WHEN mating_result IN (?, ?) THEN cow_id END) AS other_count, -- 其他数
|
|
|
+ (
|
|
|
+ COUNT(DISTINCT CASE WHEN mating_result = ? AND mating_result_at > 0 THEN cow_id END) +
|
|
|
+ COUNT(DISTINCT CASE WHEN mating_result = ? AND mating_result_at > 0 THEN cow_id END) +
|
|
|
+ COUNT(DISTINCT CASE WHEN mating_result IN (?, ?) THEN cow_id END)
|
|
|
+ ) AS total_count -- 总数
|
|
|
+ `, pasturePb.MatingResult_Pregnant, pasturePb.MatingResult_Empty, pasturePb.MatingResult_Abort,
|
|
|
+ pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch, pasturePb.MatingResult_Pregnant,
|
|
|
+ pasturePb.MatingResult_Empty, pasturePb.MatingResult_Unknown, pasturePb.MatingResult_ReMatch).
|
|
|
Where("status = ?", pasturePb.IsShow_Ok).
|
|
|
- Where("cow_type = ?", req.CowType)
|
|
|
+ Where("cow_type = ?", req.CowType).
|
|
|
+ Where("reality_day BETWEEN ? AND ?", startTimeUnix, endTimeUnix)
|
|
|
|
|
|
if req.LactCompareSymbol > 0 {
|
|
|
switch req.LactCompareSymbol {
|
|
@@ -572,40 +609,17 @@ func (s *StoreEntry) MultipleFactorAnalysis(ctx context.Context, req *pasturePb.
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if req.MatingTimesCompareSymbol > 0 {
|
|
|
- switch req.MatingTimesCompareSymbol {
|
|
|
- case pasturePb.CompareSymbol_Less_Than:
|
|
|
- pref.Where("mating_number < ?", req.LactStartValue)
|
|
|
- case pasturePb.CompareSymbol_Less_Than_Or_Equal_To:
|
|
|
- pref.Where("mating_number <= ?", req.LactStartValue)
|
|
|
- case pasturePb.CompareSymbol_Greater_Than:
|
|
|
- pref.Where("mating_number > ?", req.LactStartValue)
|
|
|
- case pasturePb.CompareSymbol_Greater_Than_Or_Equal_To:
|
|
|
- pref.Where("mating_number >= ?", req.LactStartValue)
|
|
|
- case pasturePb.CompareSymbol_Equal_To:
|
|
|
- pref.Where("mating_number = ?", req.LactStartValue)
|
|
|
- case pasturePb.CompareSymbol_Not_Equal_To:
|
|
|
- pref.Where("mating_number != ?", req.LactStartValue)
|
|
|
- case pasturePb.CompareSymbol_Between:
|
|
|
- pref.Where("mating_number BETWEEN ? AND ? ", req.LactStartValue, req.LactEndValue)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if req.XAxle > 0 {
|
|
|
- switch req.XAxle {
|
|
|
- case pasturePb.MultiFactorAnalysisMethod_Months:
|
|
|
- pref.Select(`
|
|
|
- DATE_FORMAT(reality_day, '%Y-%m') AS statistic_method,
|
|
|
- COUNT(DISTINCT CASE WHEN mating_result = ? AND mating_result_at > 0 THEN cow_id END) AS pregnant_count, -- 怀孕头数
|
|
|
- COUNT(DISTINCT CASE WHEN mating_result = ? AND mating_result_at > 0 THEN cow_id END) AS empty_pregnant_count, -- 空怀头数
|
|
|
- COUNT(DISTINCT CASE WHEN mating_result = ? AND mating_result_at > 0 THEN cow_id END) AS abortion_count, -- 流产头数
|
|
|
- `)
|
|
|
-
|
|
|
+ multiFactorAnalysisMethod := s.MultiFactorAnalysisMethodMap()
|
|
|
+ groupMap := make(map[string]string)
|
|
|
+ for k1, v1 := range multiFactorAnalysisMethod {
|
|
|
+ for k2, v2 := range multiFactorAnalysisMethod {
|
|
|
+ groupMap[fmt.Sprintf("%d%d", k1, k2)] = fmt.Sprintf("%s,%s", v1, v2)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
list := make([]*pasturePb.MultiFactorPregnancyRateList, 0)
|
|
|
- if err := pref.Group("statistic_method").Find(&list).Error; err != nil {
|
|
|
+ if err := pref.Group(groupMap[fmt.Sprintf("%d%d", req.XAxle, req.YAxle)]).
|
|
|
+ Order(fmt.Sprintf("%s", multiFactorAnalysisMethod[req.XAxle])).Find(&list).Error; err != nil {
|
|
|
return nil, xerr.WithStack(err)
|
|
|
}
|
|
|
|
|
@@ -614,6 +628,64 @@ func (s *StoreEntry) MultipleFactorAnalysis(ctx context.Context, req *pasturePb.
|
|
|
PregnantRate: make(map[string]*pasturePb.PregnancyRate),
|
|
|
}
|
|
|
|
|
|
+ for _, v := range list {
|
|
|
+ switch req.XAxle {
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Months:
|
|
|
+ chart.Headers = append(chart.Headers, v.Months)
|
|
|
+ v.StatisticMethod1 = v.Months
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Week:
|
|
|
+ chart.Headers = append(chart.Headers, v.Week)
|
|
|
+ v.StatisticMethod1 = v.Week
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Operation:
|
|
|
+ chart.Headers = append(chart.Headers, v.OperationName)
|
|
|
+ v.StatisticMethod1 = v.OperationName
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Bull:
|
|
|
+ chart.Headers = append(chart.Headers, v.Bull)
|
|
|
+ v.StatisticMethod1 = v.Bull
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Lact:
|
|
|
+ chart.Headers = append(chart.Headers, v.Lact)
|
|
|
+ v.StatisticMethod1 = v.Lact
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Mating_Times:
|
|
|
+ chart.Headers = append(chart.Headers, v.MatingTimes)
|
|
|
+ v.StatisticMethod1 = v.MatingTimes
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Breeding_Method:
|
|
|
+ chart.Headers = append(chart.Headers, v.ExposeEstrusType)
|
|
|
+ v.StatisticMethod1 = v.ExposeEstrusType
|
|
|
+ }
|
|
|
+
|
|
|
+ switch req.YAxle {
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Months:
|
|
|
+ v.StatisticMethod2 = v.Months
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Week:
|
|
|
+ v.StatisticMethod2 = v.Week
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Operation:
|
|
|
+ v.StatisticMethod2 = v.OperationName
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Bull:
|
|
|
+ v.StatisticMethod2 = v.Bull
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Lact:
|
|
|
+ v.StatisticMethod2 = v.Lact
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Mating_Times:
|
|
|
+ v.StatisticMethod2 = v.MatingTimes
|
|
|
+ case pasturePb.MultiFactorAnalysisMethod_Breeding_Method:
|
|
|
+ v.StatisticMethod2 = v.ExposeEstrusType
|
|
|
+ }
|
|
|
+
|
|
|
+ chart.Keys = append(chart.Keys, v.StatisticMethod1)
|
|
|
+ chart.PregnantRate[v.StatisticMethod1] = &pasturePb.PregnancyRate{
|
|
|
+ Params: make(map[string]string),
|
|
|
+ }
|
|
|
+ pregnantRate := float64(0)
|
|
|
+ if v.EmptyPregnantCount+v.PregnantCount > 0 {
|
|
|
+ pregnantRate = float64(v.PregnantCount) / float64(v.EmptyPregnantCount+v.PregnantCount)
|
|
|
+ }
|
|
|
+ v.PregnantRate = float32(util.RoundToTwoDecimals(pregnantRate * 100))
|
|
|
+ spcRate := float32(0)
|
|
|
+ if v.PregnantRate > 0 {
|
|
|
+ spcRate = float32(util.RoundToTwoDecimals((float64(v.PregnantCount) / float64(v.TotalCount)) * 100))
|
|
|
+ }
|
|
|
+ v.SpcRate = spcRate
|
|
|
+ }
|
|
|
+
|
|
|
return &pasturePb.MultiFactorPregnancyRateResponse{
|
|
|
Code: http.StatusOK,
|
|
|
Message: "ok",
|