123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- 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
- }
|