|
@@ -43,3 +43,284 @@ func (e *Entry) LactationCow(pastureList []*model.AppPastureList, milkKind pastu
|
|
|
}
|
|
|
return res
|
|
|
}
|
|
|
+
|
|
|
+// FirstBornSurvivalRate 头胎接产成活率
|
|
|
+func (e *Entry) FirstBornSurvivalRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
|
|
|
+ res := make(map[int64]string)
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ eventCalvingList := make([]*model.EventCalving, 0)
|
|
|
+ if err := e.DB.Model(new(model.EventCalving)).
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("status = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("lact = ?", 0).
|
|
|
+ Where("reality_day BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Find(&eventCalvingList).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+ calvingIds := make([]int64, 0)
|
|
|
+ for _, v := range eventCalvingList {
|
|
|
+ calvingIds = append(calvingIds, v.Id)
|
|
|
+ }
|
|
|
+
|
|
|
+ var allLiveCow int64
|
|
|
+ if err := e.DB.Model(new(model.CalvingCalf)).
|
|
|
+ Select("count(*) as all_live_cow").
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("calving_id IN (?)", calvingIds).
|
|
|
+ Where("is_live = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("birth_at BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Scan(&allLiveCow).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ allCowCalving := len(eventCalvingList)
|
|
|
+ if allCowCalving > 0 {
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%.2f", float64(allLiveCow)/float64(allCowCalving))
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
+// FirstBornDeathRate 头胎接产死亡率
|
|
|
+func (e *Entry) FirstBornDeathRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
|
|
|
+ res := make(map[int64]string)
|
|
|
+
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ eventCalvingList := make([]*model.EventCalving, 0)
|
|
|
+ if err := e.DB.Model(new(model.EventCalving)).
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("status = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("lact = ?", 0).
|
|
|
+ Where("reality_day BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Find(&eventCalvingList).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+ calvingIds := make([]int64, 0)
|
|
|
+ for _, v := range eventCalvingList {
|
|
|
+ calvingIds = append(calvingIds, v.Id)
|
|
|
+ }
|
|
|
+
|
|
|
+ var allDeathCow int64
|
|
|
+ if err := e.DB.Model(new(model.CalvingCalf)).
|
|
|
+ Select("count(*) as all_live_cow").
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("calving_id IN (?)", calvingIds).
|
|
|
+ Where("is_live = ?", pasturePb.IsShow_No).
|
|
|
+ Where("birth_at BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Scan(&allDeathCow).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ allCowCalving := len(eventCalvingList)
|
|
|
+ if allCowCalving > 0 {
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%.2f", float64(allDeathCow)/float64(allCowCalving))
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
+// MultiparitySurvivalRate 经产牛接产成活率
|
|
|
+func (e *Entry) MultiparitySurvivalRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
|
|
|
+ res := make(map[int64]string)
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ eventCalvingList := make([]*model.EventCalving, 0)
|
|
|
+ if err := e.DB.Model(new(model.EventCalving)).
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("status = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("lact > ?", 0).
|
|
|
+ Where("reality_day BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Find(&eventCalvingList).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ calvingIds := make([]int64, 0)
|
|
|
+ for _, v := range eventCalvingList {
|
|
|
+ calvingIds = append(calvingIds, v.Id)
|
|
|
+ }
|
|
|
+
|
|
|
+ var allLiveCow int64
|
|
|
+ if err := e.DB.Model(new(model.CalvingCalf)).
|
|
|
+ Select("count(*) as all_live_cow").
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("calving_id IN (?)", calvingIds).
|
|
|
+ Where("is_live = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("birth_at BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Scan(&allLiveCow).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ allCowCalving := len(eventCalvingList)
|
|
|
+ if allCowCalving > 0 {
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%.2f", float64(allLiveCow)/float64(allCowCalving))
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
+// MultiparityDeathRate 经产牛接产死亡率
|
|
|
+func (e *Entry) MultiparityDeathRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
|
|
|
+ res := make(map[int64]string)
|
|
|
+
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ eventCalvingList := make([]*model.EventCalving, 0)
|
|
|
+ if err := e.DB.Model(new(model.EventCalving)).
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("status = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("lact > ?", 0).
|
|
|
+ Where("reality_day BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Find(&eventCalvingList).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ calvingIds := make([]int64, 0)
|
|
|
+ for _, v := range eventCalvingList {
|
|
|
+ calvingIds = append(calvingIds, v.Id)
|
|
|
+ }
|
|
|
+
|
|
|
+ var allDeathCow int64
|
|
|
+ if err := e.DB.Model(new(model.CalvingCalf)).
|
|
|
+ Select("count(*) as all_live_cow").
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("calving_id IN (?)", calvingIds).
|
|
|
+ Where("is_live = ?", pasturePb.IsShow_No).
|
|
|
+ Where("birth_at BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Scan(&allDeathCow).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ allCowCalving := len(eventCalvingList)
|
|
|
+ if allCowCalving > 0 {
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%.2f", float64(allDeathCow)/float64(allCowCalving))
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
+// AvgAgeFirstMate 平均首配日龄
|
|
|
+func (e *Entry) AvgAgeFirstMate(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
|
|
|
+ res := make(map[int64]string)
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ eventMatingList := make([]*model.EventMating, 0)
|
|
|
+ if err := e.DB.Model(new(model.EventMating)).
|
|
|
+ Select("day_age,cow_id").
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("status = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("lact = ?", 0).
|
|
|
+ Where("reality_day BETWEEN ? AND ?", startTime, endTime).
|
|
|
+ Find(&eventMatingList).Error; err != nil {
|
|
|
+ zaplog.Error("FindCalvingInterval", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
|
|
|
+ }
|
|
|
+ cowMatingDayAge := int32(0)
|
|
|
+ for _, v := range eventMatingList {
|
|
|
+ cowMatingDayAge += v.DayAge
|
|
|
+ }
|
|
|
+
|
|
|
+ if cowMatingDayAge > 0 {
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%d", cowMatingDayAge/int32(len(eventMatingList)))
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
+// CowPregnantRate 后备牛怀孕比例
|
|
|
+func (e *Entry) CowPregnantRate(pastureList []*model.AppPastureList, caseName string) map[int64]string {
|
|
|
+ res := make(map[int64]string)
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ cowList := make([]*model.Cow, 0)
|
|
|
+ if err := e.DB.Model(new(model.Cow)).
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("breed_status = ?", pasturePb.BreedStatus_Pregnant).
|
|
|
+ Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
|
|
|
+ Find(&cowList).Error; err != nil {
|
|
|
+ zaplog.Error("YouthPregnantRate", zap.Any("pasture_id", pasture.Id), zap.Any("error", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ allYouthCow, allMultiCow := 0, 0
|
|
|
+ for _, cow := range cowList {
|
|
|
+ if cow.Lact == 0 {
|
|
|
+ allYouthCow += 1
|
|
|
+ } else {
|
|
|
+ allMultiCow += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if caseName == "youth_pregnant_rate" {
|
|
|
+ if allYouthCow > 0 {
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%.2f", float64(allYouthCow)/float64(len(cowList)))
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ } else if caseName == "multiparty_pregnant_rate" {
|
|
|
+ if allMultiCow > 0 {
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%.2f", float64(allMultiCow)/float64(len(cowList)))
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
+// PregnantCheckRate 孕检有胎率
|
|
|
+func (e *Entry) PregnantCheckRate(pastureList []*model.AppPastureList, startAt, endAt int64, isLact bool, pregnantCheckName string) map[int64]string {
|
|
|
+ res := make(map[int64]string)
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ eventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
|
|
|
+ pref := e.DB.Model(new(model.EventPregnantCheck)).
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("status = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("pregnant_check_name = ?", pregnantCheckName).
|
|
|
+ Where("reality_day BETWEEN ? AND ?", startAt, endAt)
|
|
|
+ if isLact {
|
|
|
+ pref = pref.Where("is_lact > ?", 0)
|
|
|
+ } else {
|
|
|
+ pref = pref.Where("is_lact = ?", 0)
|
|
|
+ }
|
|
|
+ if err := pref.Find(&eventPregnantCheckList).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+
|
|
|
+ isOK := 0
|
|
|
+ for _, v := range eventPregnantCheckList {
|
|
|
+ if v.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant {
|
|
|
+ isOK += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(eventPregnantCheckList) > 0 {
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%.2f", float64(isOK)/float64(len(eventPregnantCheckList)))
|
|
|
+ } else {
|
|
|
+ res[pasture.Id] = "0"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return res
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func (e *Entry) ForbiddenCowNumber(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
|
|
|
+ res := make(map[int64]string)
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ var count int64
|
|
|
+ if err := e.DB.Model(new(model.EventForbiddenMating)).
|
|
|
+ Where("pasture_id = ?", pasture.Id).
|
|
|
+ Where("is_show = ?", pasturePb.IsShow_Ok).
|
|
|
+ Where("forbidden_mating_at BETWEEN ? AND ?", startAt, endAt).
|
|
|
+ Count(&count).Error; err != nil {
|
|
|
+ zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
|
|
|
+ }
|
|
|
+ res[pasture.Id] = fmt.Sprintf("%d", count)
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|