123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- 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"
- )
- // AdultCowsPregnancyRate 成牛受胎率
- func (e *Entry) AdultCowsPregnancyRate(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
- res := make(map[int64]string)
- for _, pasture := range pastureList {
- var (
- pregnantCount int64 // 确认怀孕的
- realityBreedCount int64 // 参与配种的
- )
- 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("mating_result_at BETWEEN ? AND ?", startTime, endTime).
- Count(&pregnantCount).Error; err != nil {
- zaplog.Error("pregnantCount", zap.Any("err", err))
- }
- if err := e.DB.Model(new(model.EventMating)).
- Where("pasture_id = ?", pasture.Id).
- Where("status = ?", pasturePb.IsShow_Ok).
- Where("reality_day BETWEEN ? AND ?", startTime, endTime).
- Count(&realityBreedCount).Error; err != nil {
- zaplog.Error("realityBreedCount", zap.Any("err", err))
- }
- if realityBreedCount > 0 && pregnantCount > 0 {
- res[pasture.Id] = fmt.Sprintf("%.2f", float64(pregnantCount)/float64(realityBreedCount))
- } else {
- res[pasture.Id] = "0"
- }
- }
- return res
- }
- // LactPregnancyRate 母牛不同胎次受胎率
- func (e *Entry) LactPregnancyRate(pastureList []*model.AppPastureList, condition string, startTime, endTime int64) map[int64]string {
- res := make(map[int64]string)
- for _, pasture := range pastureList {
- var (
- pregnantCount int64 // 确认怀孕的
- realityBreedCount int64 // 参与配种的
- )
- if err := e.DB.Model(new(model.EventMating)).
- Where("pasture_id = ?", pasture.Id).
- Where("status = ?", pasturePb.IsShow_Ok).
- Where(condition).
- Where("mating_result = ?", pasturePb.MatingResult_Pregnant).
- Where("mating_result_at BETWEEN ? AND ?", startTime, endTime).
- Count(&pregnantCount).Error; err != nil {
- zaplog.Error("pregnantCount", zap.Any("err", err))
- }
- if err := e.DB.Model(new(model.EventMating)).
- Where("pasture_id = ?", pasture.Id).
- Where("status = ?", pasturePb.IsShow_Ok).
- Where(condition).
- Where("reality_day BETWEEN ? AND ?", startTime, endTime).
- Count(&realityBreedCount).Error; err != nil {
- zaplog.Error("realityBreedCount", zap.Any("err", err))
- }
- if realityBreedCount > 0 && pregnantCount > 0 {
- res[pasture.Id] = fmt.Sprintf("%.2f", float64(pregnantCount)/float64(realityBreedCount))
- } else {
- res[pasture.Id] = "0"
- }
- }
- return res
- }
- // MatingPregnancyRate 第1次配种受胎率/第2次配种受胎率
- func (e *Entry) MatingPregnancyRate(pastureList []*model.AppPastureList, kind string, startTime, endTime int64) map[int64]string {
- res := make(map[int64]string)
- for _, pasture := range pastureList {
- if kind != model.FirstMatingPregnancyRate && kind != model.SecondMatingPregnancyRate {
- res[pasture.Id] = "0"
- continue
- }
- var (
- pregnantCount int64 // 确认怀孕的
- realityBreedCount int64 // 参与配种的
- )
- pref1 := e.DB.Model(new(model.EventMating)).
- Where("pasture_id = ?", pasture.Id).
- Where("status = ?", pasturePb.IsShow_Ok).
- Where("mating_result = ?", pasturePb.MatingResult_Pregnant).
- Where("mating_result_at BETWEEN ? AND ?", startTime, endTime)
- if kind == model.FirstMatingPregnancyRate {
- pref1 = pref1.Where("remating_at = ?", 0)
- }
- if kind == model.SecondMatingPregnancyRate {
- pref1 = pref1.Where("remating_at > ?", 0)
- }
- if err := pref1.Count(&pregnantCount).Error; err != nil {
- zaplog.Error("pregnantCount", zap.Any("err", err))
- }
- pref2 := e.DB.Model(new(model.EventMating)).
- Where("pasture_id = ?", pasture.Id).
- Where("status = ?", pasturePb.IsShow_Ok).
- Where("reality_day BETWEEN ? AND ?", startTime, endTime)
- if kind == model.FirstMatingPregnancyRate {
- pref2 = pref2.Where("remating_at = ?", 0)
- }
- if kind == model.SecondMatingPregnancyRate {
- pref2 = pref2.Where("remating_at > ?", 0)
- }
- if err := pref2.Count(&realityBreedCount).Error; err != nil {
- zaplog.Error("realityBreedCount", zap.Any("err", err))
- }
- if realityBreedCount > 0 && pregnantCount > 0 {
- res[pasture.Id] = fmt.Sprintf("%.2f", float64(pregnantCount)/float64(realityBreedCount))
- } else {
- res[pasture.Id] = "0"
- }
- }
- return res
- }
- // Day75DayMatingRate 75天配种率(在群)
- func (e *Entry) Day75DayMatingRate(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("calving_age >= ?", 75).
- Find(&cowList).Error; err != nil {
- zaplog.Error("matingCount", zap.Any("err", err))
- }
- cowIds := make([]int64, 0)
- for _, cow := range cowList {
- cowIds = append(cowIds, cow.Id)
- }
- var matingCowCount int64
- if err := e.DB.Model(new(model.EventMating)).
- Where("pasture_id = ?", pasture.Id).
- Where("status = ?", pasturePb.IsShow_Ok).
- Where("cow_id IN ?", cowIds).
- Where("calving_age < ?", 75).
- Count(&matingCowCount).Error; err != nil {
- zaplog.Error("matingCount", zap.Any("err", err))
- }
- if len(cowIds) > 0 && matingCowCount > 0 {
- res[pasture.Id] = fmt.Sprintf("%.2f", float64(matingCowCount)/float64(len(cowIds)))
- } else {
- res[pasture.Id] = "0"
- }
- }
- return res
- }
- // Day75MonthMatingRate 75天配种率(月度)
- func (e *Entry) Day75MonthMatingRate(pastureList []*model.AppPastureList, indicatorsId int64) map[int64]string {
- res := make(map[int64]string)
- nowTime := time.Now().Local()
- monthStartAt, monthEndAt := util.GetMonthStartAndEndTimestamp()
- nowTimeFormat := nowTime.Format(model.LayoutDate2)
- monthStartAtFormat := time.Unix(monthStartAt, 0).Local().Format(model.LayoutDate2)
- monthEndAtFormat := time.Unix(monthEndAt, 0).Local().Format(model.LayoutDate2)
- if nowTimeFormat != monthStartAtFormat || nowTimeFormat != monthEndAtFormat {
- for _, pasture := range pastureList {
- res[pasture.Id] = "0"
- }
- return res
- }
- if nowTimeFormat == monthStartAtFormat {
- for _, pasture := range pastureList {
- cowList := make([]*model.Cow, 0)
- if err := e.DB.Model(new(model.Cow)).Where("pasture_id = ?", pasture.Id).
- Where("calving_age < ?", 75).
- Where("sex = ?", pasturePb.Genders_Female).
- Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
- Find(&cowList).Error; err != nil {
- zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
- }
- if len(cowList) > 0 {
- newIndicatorsCowList := model.NewIndicatorsCowList(pasture.Id, indicatorsId, nowTimeFormat, cowList)
- if err := e.DB.Model(new(model.IndicatorsCow)).
- Create(newIndicatorsCowList).Error; err != nil {
- zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
- }
- }
- res[pasture.Id] = "0"
- }
- return res
- }
- if nowTimeFormat == monthEndAtFormat {
- for _, pasture := range pastureList {
- indicatorsCowList := make([]*model.IndicatorsCow, 0)
- if err := e.DB.Model(new(model.IndicatorsCow)).
- Where("pasture_id = ?", pasture.Id).
- Where("indicators_id = ?", indicatorsId).
- Where("date_time = ?", monthStartAtFormat).
- Find(&indicatorsCowList).Error; err != nil {
- zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
- }
- cowIds := make([]int64, 0)
- for _, indicatorsCow := range indicatorsCowList {
- cowIds = append(cowIds, indicatorsCow.CowId)
- }
- var historyCowCount int64
- if err := e.DB.Table(fmt.Sprintf("%s as cow as a", new(model.Cow).TableName())).
- Joins("LEFT JOIN %s as b on a.id = b.cow_id", new(model.EventMating).TableName()).
- Where("a.pasture_id = ?", pasture.Id).
- Where("a.id IN ?", cowIds).
- Where("b.status = ?", pasturePb.IsShow_Ok).
- Where("b.calving_age < ?", 75).
- Where("a.calving_age >= ?", 75).
- Count(&historyCowCount).Error; err != nil {
- zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
- }
- var currentCowCount int64
- if err := e.DB.Model(new(model.Cow)).
- Where("pasture_id = ?", pasture.Id).
- Where("calving_age >= ?", 75).
- Where("sex = ?", pasturePb.Genders_Female).
- Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
- Count(¤tCowCount).Error; err != nil {
- zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
- }
- if currentCowCount > 0 && historyCowCount > 0 {
- res[pasture.Id] = fmt.Sprintf("%.2f", float64(historyCowCount)/float64(currentCowCount))
- } else {
- res[pasture.Id] = "0"
- }
- }
- }
- return res
- }
- // AvgAdultCowEmptyNumber 成母牛平均空怀天数
- func (e *Entry) AvgAdultCowEmptyNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
- res := make(map[int64]string)
- for _, pasture := range pastureList {
- var v = struct {
- EmptyDays int64
- CowCount int64
- }{
- EmptyDays: 0,
- CowCount: 0,
- }
- if err := e.DB.Model(new(model.Cow)).
- Select(`
- SUM(
- CASE
- -- 未孕牛只:空怀天数 = 当前日期 - 产犊日期
- WHEN is_pregnant = 2 AND last_calving_at > 0 THEN
- DATEDIFF(
- FROM_UNIXTIME(UNIX_TIMESTAMP()),
- FROM_UNIXTIME(last_calving_at)
- )
- -- 已孕牛只:空怀天数 = 配种结果为怀孕的配种日期 - 产犊日期
- WHEN is_pregnant = 1 AND last_mating_at > 0 AND last_calving_at > 0 THEN
- DATEDIFF(
- FROM_UNIXTIME(last_mating_at),
- FROM_UNIXTIME(last_calving_at)
- )
- ELSE 0
- END
- ) AS empty_days,count(*) AS cow_count`).
- Where("pasture_id = ?", pasture.Id).
- Where("sex = ?", pasturePb.Genders_Female).
- Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
- Where("lact >= ?", 1).
- First(&v).
- Error; err != nil {
- zaplog.Error("AvgAdultCowEmptyNumber", zap.Any("err", err))
- }
- if v.CowCount > 0 && v.EmptyDays > 0 {
- res[pasture.Id] = fmt.Sprintf("%.2f", float64(v.EmptyDays)/float64(v.CowCount))
- } else {
- res[pasture.Id] = "0"
- }
- }
- return res
- }
|