|  | @@ -0,0 +1,82 @@
 | 
	
		
			
				|  |  | +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"
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 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
 | 
	
		
			
				|  |  | +}
 |