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" ) // SurvivalLiveRate 接产成活率 func (e *Entry) SurvivalLiveRate(pastureList []*model.AppPastureList, startAt, endAt int64, pregnancyAge int32) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { eventCalving := 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(&eventCalving).Error; err != nil { zaplog.Error("SurvivalLiveRate", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } allEventCalving := int32(len(eventCalving)) calvingIds := make([]int64, 0) for _, v := range eventCalving { if v.CalvingLevel == pasturePb.CalvingLevel_Natural_Childbirth && v.PregnancyAge > pregnancyAge { calvingIds = append(calvingIds, v.Id) } } var count int64 if err := e.DB.Model(new(model.CalvingCalf)). Where("calving_id IN ?", calvingIds). Where("is_live = ?", pasturePb.IsShow_Ok). Count(&count).Error; err != nil { zaplog.Error("SurvivalLiveRate", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } if count > 0 && allEventCalving > 0 { res[pasture.Id] = fmt.Sprintf("%.2f", float64(count)/float64(allEventCalving)) } else { res[pasture.Id] = "0" } } return res } // StillbirthRate 死胎率 func (e *Entry) StillbirthRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { eventCalving := 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(&eventCalving).Error; err != nil { zaplog.Error("SurvivalLiveRate", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } allEventCalving := int32(len(eventCalving)) calvingIds := make([]int64, 0) for _, v := range eventCalving { calvingIds = append(calvingIds, v.Id) } var count int64 if err := e.DB.Model(new(model.CalvingCalf)). Where("calving_id IN ?", calvingIds). Where("is_live = ?", pasturePb.IsShow_No). Count(&count).Error; err != nil { zaplog.Error("SurvivalLiveRate", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } if count > 0 && allEventCalving > 0 { res[pasture.Id] = fmt.Sprintf("%.2f", float64(count)/float64(allEventCalving)) } else { res[pasture.Id] = "0" } } return res } // FemaleCalfRate 母犊率 func (e *Entry) FemaleCalfRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { eventCalving := 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(&eventCalving).Error; err != nil { zaplog.Error("SurvivalLiveRate", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } allEventCalving := int32(len(eventCalving)) calvingIds := make([]int64, 0) for _, v := range eventCalving { calvingIds = append(calvingIds, v.Id) } var count int64 if err := e.DB.Model(new(model.CalvingCalf)). Where("calving_id IN ?", calvingIds). Where("sex = ?", pasturePb.Genders_Female). Count(&count).Error; err != nil { zaplog.Error("SurvivalLiveRate", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } if count > 0 && allEventCalving > 0 { res[pasture.Id] = fmt.Sprintf("%.2f", float64(count)/float64(allEventCalving)) } else { res[pasture.Id] = "0" } } return res } // WeaningDailyWeight 犊牛断奶日增重 func (e *Entry) WeaningDailyWeight(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { eventWeaningList := make([]*model.EventWeaning, 0) if err := e.DB.Model(new(model.EventWeaning)). Where("pasture_id = ?", pasture.Id). Where("status = ?", pasturePb.IsShow_Ok). Where("reality_day BETWEEN ? AND ?", startAt, endAt). Find(&eventWeaningList).Error; err != nil { zaplog.Error("SurvivalLiveRate", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } allData := float64(0) count := float64(len(eventWeaningList)) for _, v := range eventWeaningList { allData += float64(v.Weight-v.BirthWeight) / 1000 / float64(v.DayAge) } if allData > 0 && count > 0 { res[pasture.Id] = fmt.Sprintf("%.2f", allData/count) } else { res[pasture.Id] = "0" } } return res } // DayDieRate 日龄死亡率 func (e *Entry) DayDieRate(pastureList []*model.AppPastureList, startAt, endAt int64, dayAge int32) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { eventDeathList := make([]*model.EventDeath, 0) if err := e.DB.Model(new(model.EventDeath)). Where("pasture_id = ?", pasture.Id). Where("death_at BETWEEN ? AND ?", startAt, endAt). Find(&eventDeathList).Error; err != nil { zaplog.Error("Calving60DieRate", zap.Any("pastureId", pasture.Id), zap.Any("err", err)) } count := float64(len(eventDeathList)) target := float64(0) for _, v := range eventDeathList { if v.DayAge <= dayAge { target++ } } if count > 0 && target > 0 { res[pasture.Id] = fmt.Sprintf("%.2f", target/count) } else { res[pasture.Id] = "0" } } return res }