package crontab import ( "fmt" "kpt-pasture/model" 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). 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). 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 }