package crontab import ( "fmt" "kpt-pasture/model" "math" "strconv" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" "gitee.com/xuyiping_admin/pkg/logger/zaplog" "go.uber.org/zap" ) // FindAdultAbortionRate 成母牛流产率(全) func (e *Entry) FindAdultAbortionRate(pastureList []*model.AppPastureList, cowType string, startTime, endTime int64) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { var count int64 pref := e.DB.Model(new(model.EventAbortion)). Where("pasture_id = ?", pasture.Id). Where("abortion_at BETWEEN ? AND ?", startTime, endTime). Where("is_append = ?", pasturePb.IsShow_Ok) if cowType == "youth" { pref.Where("lact = ?", 0) } if cowType == "adult" { pref.Where("lact > ?", 0) } if err := pref.Count(&count).Error; err != nil { zaplog.Error("FindAdultAbortionRate", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // FindDepartureNumber 出栏量(销售) func (e *Entry) FindDepartureNumber(pastureList []*model.AppPastureList, saleKind pasturePb.SalesType_Kind, 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("departure_at BETWEEN ? AND ?", startTime, endTime). Where("sale_kind = ?", saleKind). Count(&count).Error; err != nil { zaplog.Error("FindAllDieNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // FindDiseaseNumber 发病头数 func (e *Entry) FindDiseaseNumber(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.EventCowDisease)). Where("pasture_id = ?", pasture.Id). Where("disease_at BETWEEN ? AND ?", startTime, endTime). Where("diagnosed_result = ?", pasturePb.IsShow_Ok). Count(&count).Error; err != nil { zaplog.Error("FindDiseaseNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // FindCureNumber 治愈头数 func (e *Entry) FindCureNumber(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.EventCowDisease)). Where("pasture_id = ?", pasture.Id). Where("curable_at BETWEEN ? AND ?", startTime, endTime). Where("diagnosed_result = ?", pasturePb.IsShow_Ok). Count(&count).Error; err != nil { zaplog.Error("FindCureNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // FindDeathNumber 全群牛死亡数 func (e *Entry) FindDeathNumber(pastureList []*model.AppPastureList, startTime, endTime int64, isCalf bool) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { var count int64 pref := e.DB.Model(new(model.EventDeath)). Where("pasture_id = ?", pasture.Id). Where("death_at BETWEEN ? AND ?", startTime, endTime) if isCalf { pref.Where("day_age <= ?", 60) } if err := pref.Count(&count).Error; err != nil { zaplog.Error("FindAllDieNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // MultipartyAbortionNumber 成母牛流产数 func (e *Entry) MultipartyAbortionNumber(pastureList []*model.AppPastureList, startTime, endTime int64, isAppend pasturePb.IsShow_Kind) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { var count int64 if err := e.DB.Model(new(model.EventAbortion)). Where("pasture_id = ?", pasture.Id). Where("abortion_at BETWEEN ? AND ?", startTime, endTime). Where("is_append = ?", pasturePb.IsShow_Ok). Where("lact > ?", 0). Where("is_append = ?", isAppend). Count(&count).Error; err != nil { zaplog.Error("multipartyAbortionNumber", zap.Any("pastureId", pasture), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // MultipartyPregnancyNumber 成母牛怀孕头数 func (e *Entry) MultipartyPregnancyNumber(pastureList []*model.AppPastureList) 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("sex = ?", pasturePb.Genders_Female). Where("breed_status = ?", pasturePb.BreedStatus_Pregnant). Where("lact > ?", 0). Count(&count).Error; err != nil { zaplog.Error("") } if count > 0 { res[pasture.Id] = fmt.Sprintf("%d", count) } else { res[pasture.Id] = "0" } } return res } // MultipartyAbortionRate 成母牛流产率 func (e *Entry) MultipartyAbortionRate(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string { abortionNumberMap := e.MultipartyAbortionNumber(pastureList, startTime, endTime, pasturePb.IsShow_Ok) pregnancyNumberMap := e.MultipartyPregnancyNumber(pastureList) res := make(map[int64]string) for pastureId, value1 := range abortionNumberMap { var info bool if value2, ok := pregnancyNumberMap[pastureId]; ok { v1, _ := strconv.ParseInt(value1, 10, 64) v2, _ := strconv.ParseInt(value2, 10, 64) if v2 > 0 { info = true abortionRate := float32(math.Round(float64(v1)/float64(v2)*100) / 100) res[pastureId] = fmt.Sprintf("%f", abortionRate) } } if !info { res[pastureId] = "0" } } return res } // MultipartyOutNumber 成母牛淘汰牛头数 func (e *Entry) MultipartyOutNumber(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.Table(fmt.Sprintf("%s as a", new(model.EventSaleCow).TableName())). Joins(fmt.Sprintf("JOIN %s AS b on a.sale_id = b.id", new(model.EventSale).TableName())). Select("COUNT(*) AS count"). Where("a.pasture_id = ?", pasture.Id). Where("b.sale_at BETWEEN ? AND ?", startTime, endTime). Where("a.out_reasons_kind = ?", pasturePb.SalesType_Out). Where("a.lact > ?", 0). Scan(&count).Error; err != nil { zaplog.Error("MultipartyOutNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // MultipartyDieNumber 成母牛死亡数 func (e *Entry) MultipartyDieNumber(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.EventDeath)). Where("pasture_id = ?", pasture.Id). Where("death_at BETWEEN ? AND ?", startTime, endTime). Where("lact > ?", 0). Scan(&count).Error; err != nil { zaplog.Error("MultipartyOutNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } res[pasture.Id] = fmt.Sprintf("%d", count) } return res } // CalvingDieRate 产后指定天数死亡率 func (e *Entry) CalvingDieRate(pastureList []*model.AppPastureList, startTime, endTime int64, calvingAge 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 ?", startTime, endTime). Find(&eventDeathList).Error; err != nil { zaplog.Error("Calving60DieRate", zap.Any("pastureId", pasture.Id), zap.Any("err", err)) } count := int32(0) for _, v := range eventDeathList { if v.CalvingAge <= calvingAge { count++ } } if count > 0 { res[pasture.Id] = fmt.Sprintf("%f", float32(math.Round(float64(count)/float64(len(eventDeathList))*100)/100)) } else { res[pasture.Id] = "0" } } return res } // CalvingOutRate 产后指定天数淘汰率 func (e *Entry) CalvingOutRate(pastureList []*model.AppPastureList, startTime, endTime int64, calvingAge int32) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { eventSaleCowList := make([]*model.EventSaleCow, 0) if err := e.DB.Table(fmt.Sprintf("%s as a", new(model.EventSaleCow).TableName())). Joins(fmt.Sprintf("JOIN %s AS b on a.sale_id = b.id", new(model.EventSale).TableName())). Select("a.*"). Where("a.pasture_id = ?", pasture.Id). Where("b.sale_at BETWEEN ? AND ?", startTime, endTime). Where("a.out_reasons_kind = ?", pasturePb.SalesType_Out). Find(&eventSaleCowList).Error; err != nil { zaplog.Error("MultipartyOutNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } count := int32(0) for _, v := range eventSaleCowList { if v.CalvingAge <= calvingAge { count++ } } if count > 0 { res[pasture.Id] = fmt.Sprintf("%f", float32(math.Round(float64(count)/float64(len(eventSaleCowList))*100)/100)) } else { res[pasture.Id] = "0" } } return res } // AvgDepartureWeight 出栏均重 func (e *Entry) AvgDepartureWeight(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { eventSaleList := make([]*model.EventSale, 0) if err := e.DB.Model(new(model.EventSale)). Where("pasture_id = ?", pasture.Id). Where("sale_at BETWEEN ? AND ?", startTime, endTime). Find(&eventSaleList).Error; err != nil { zaplog.Error("AvgDepartureWeight", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } sumWeight := int32(0) sumCount := int32(0) for _, v := range eventSaleList { sumCount += v.SaleCowCount sumWeight += v.SaleAllWeight } if sumCount > 0 { res[pasture.Id] = fmt.Sprintf("%f", float32(math.Round(float64(sumCount)/float64(sumWeight/1000)*100)/100)) } else { res[pasture.Id] = "0" } } return res } // AvgSlaughterCycle 出栏周期 func (e *Entry) AvgSlaughterCycle(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string { res := make(map[int64]string) for _, pasture := range pastureList { eventSaleList := make([]*model.EventSale, 0) if err := e.DB.Model(new(model.EventSale)). Where("pasture_id = ?", pasture.Id). Where("sale_at BETWEEN ? AND ?", startTime, endTime). Find(&eventSaleList).Error; err != nil { zaplog.Error("AvgDepartureWeight", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } saleIds := make([]int64, len(eventSaleList)) sumCount := int32(0) sumAdmissionAge := int32(0) for i, v := range eventSaleList { sumCount += v.SaleCowCount saleIds[i] = v.Id } if len(saleIds) > 0 { eventSaleCowList := make([]*model.EventSaleCow, 0) if err := e.DB.Model(new(model.EventSaleCow)). Where("sale_id IN ?", saleIds). Find(&eventSaleCowList).Error; err != nil { zaplog.Error("AvgDepartureWeight", zap.Any("pasture_id", pasture.Id), zap.Any("err", err)) } for _, c := range eventSaleCowList { sumAdmissionAge += c.AdmissionAge } } if sumCount > 0 { res[pasture.Id] = fmt.Sprintf("%f", float32(math.Round(float64(sumCount)/float64(sumAdmissionAge)*100)/100)) } else { res[pasture.Id] = "0" } } return res }