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