package crontab import ( "fmt" "kpt-pasture/model" "kpt-pasture/util" "time" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" "gitee.com/xuyiping_admin/pkg/logger/zaplog" "go.uber.org/zap" ) // FindCalvingNumber 产犊事件总数 func (e *Entry) FindCalvingNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { var count int64 if err := e.DB.Model(new(model.EventSale)). Where("pasture_id = ?", pasture.Id). Where("status = ?", pasturePb.IsShow_Ok). Where("reality_day BETWEEN ? AND ?", startTime, endTime). Count(&count).Error; err != nil { zaplog.Error("FindCalvingNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // LactationCow 泌乳牛头数 干奶牛头数 后备牛头数 func (e *Entry) LactationCow(pastureList []*model.AppPastureList, milkKind pasturePb.CowMilk_Kind) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { var count int64 if err := e.DB.Model(new(model.Cow)). Where("pasture_id = ?", pasture.Id). Where("admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("milk_kind = ?", milkKind). Where("sex = ?", pasturePb.Genders_Female). Count(&count).Error; err != nil { zaplog.Error("LactationCow", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } 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). Where("sex = ?", pasturePb.Genders_Female). 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 } // ForbiddenCowNumber 禁配牛数 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 } // AvgRegistrationDays 平均配准天数 func (e *Entry) AvgRegistrationDays(pastureList []*model.AppPastureList) 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("admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("breed_status = ?", pasturePb.BreedStatus_Pregnant). Where("sex = ?", pasturePb.Genders_Female). Where("lact >= ?", 1). Find(&cowList).Error; err != nil { zaplog.Error("RegistrationDays", zap.Any("err", err)) } regDays := int64(0) count := int64(0) for _, cow := range cowList { if cow.LastMatingAt > 0 && cow.LastCalvingAt > 0 { regDays += util.DaysBetween(cow.LastMatingAt, cow.LastCalvingAt) count++ } } if count > 0 { res[pasture.Id] = fmt.Sprintf("%d", regDays/count) } else { res[pasture.Id] = "0" } } return res } // AvgPregnancyDays 平均怀孕天数 func (e *Entry) AvgPregnancyDays(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("reality_day BETWEEN ? AND ?", startAt, endAt). Find(&eventCalvingList).Error; err != nil { zaplog.Error("FindCalvingInterval", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } allPregnancyAge := int32(0) count := int32(0) for _, v := range eventCalvingList { if v.PregnancyAge > 0 { allPregnancyAge += v.PregnancyAge count++ } } if count > 0 { res[pasture.Id] = fmt.Sprintf("%d", allPregnancyAge/count) } else { res[pasture.Id] = "0" } } return res } // AvgGestationalAge 平均受孕日龄 func (e *Entry) AvgGestationalAge(pastureList []*model.AppPastureList) 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)). Where("pasture_id = ?", pasture.Id). Where("status = ?", pasturePb.IsShow_Ok). Where("mating_result = ?", pasturePb.MatingResult_Pregnant). Where("lact = ?", 0). Find(&eventMatingList).Error; err != nil { zaplog.Error("FindGestationalAge", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } allDayAge := int32(0) count := int32(0) for _, v := range eventMatingList { if v.DayAge > 0 && v.RealityDay > 0 { allDayAge += v.DayAge count++ } } if count > 0 { res[pasture.Id] = fmt.Sprintf("%d", allDayAge/count) } else { res[pasture.Id] = "0" } } return res } // MonthUnPregnancyRate 17-20月龄未孕比例 func (e *Entry) MonthUnPregnancyRate(pastureList []*model.AppPastureList, month int32) 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("admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("sex = ?", pasturePb.Genders_Female). Find(&cowList).Error; err != nil { zaplog.Error("AvgEmptyDays", zap.Any("pastureId", pasture.Id), zap.Any("err", err)) } nowTime := time.Now().Local() count := int32(0) for _, cow := range cowList { if cow.BirthAt <= 0 { continue } birthAt := time.Unix(cow.BirthAt, 0).Local() monthYear := util.GetMonths(birthAt, nowTime) if int32(monthYear) >= month { count++ } } if count > 0 { res[pasture.Id] = fmt.Sprintf("%.2f", float64(count)/float64(len(cowList))) } else { res[pasture.Id] = "0" } } return res } // Multiparty150DaysUnPregnancyRate 成母牛150天未孕比例 func (e *Entry) Multiparty150DaysUnPregnancyRate(pastureList []*model.AppPastureList, days int32) 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("admission_status = ?", pasturePb.AdmissionStatus_Admission). Where("sex = ?", pasturePb.Genders_Female). Where("calving_age >= ?", days). Where("lact > ?", 0). Find(&cowList).Error; err != nil { zaplog.Error("Multiparty150DaysUnPregnancyRate", zap.Any("err", err), zap.Any("pastureId", pasture.Id)) } count := int32(0) for _, cow := range cowList { if cow.BreedStatus != pasturePb.BreedStatus_Pregnant { count++ } } if count > 0 { res[pasture.Id] = fmt.Sprintf("%.2f", float64(count)/float64(len(cowList))) } else { res[pasture.Id] = "0" } } return res }