|
@@ -0,0 +1,174 @@
|
|
|
+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
|
|
|
+}
|