|  | @@ -4,12 +4,9 @@ import (
 | 
	
		
			
				|  |  |  	"kpt-pasture/model"
 | 
	
		
			
				|  |  |  	"kpt-pasture/util"
 | 
	
		
			
				|  |  |  	"math"
 | 
	
		
			
				|  |  | -	"time"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	"gitee.com/xuyiping_admin/pkg/xerr"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	"gitee.com/xuyiping_admin/pkg/logger/zaplog"
 | 
	
		
			
				|  |  |  	"go.uber.org/zap"
 | 
	
		
			
				|  |  |  )
 | 
	
	
		
			
				|  | @@ -113,57 +110,6 @@ func (e *Entry) isEventCowLog(pastureId int64, CowId int64, startAt, endAt int64
 | 
	
		
			
				|  |  |  	return count > 0
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (e *Entry) NeckRingHealthWarning() error {
 | 
	
		
			
				|  |  | -	pastureList := e.FindPastureList()
 | 
	
		
			
				|  |  | -	if pastureList == nil || len(pastureList) == 0 {
 | 
	
		
			
				|  |  | -		return nil
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	for _, pasture := range pastureList {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		e.DB.Model(new(model.NeckRingHealthWarning)).
 | 
	
		
			
				|  |  | -			Where("pasture_id = ?", pasture.Id).
 | 
	
		
			
				|  |  | -			Delete(new(model.NeckRingHealthWarning))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		if err := e.UpdateNeckRingHealth(pasture.Id); err != nil {
 | 
	
		
			
				|  |  | -			zaplog.Error("NeckRingHealthWarning",
 | 
	
		
			
				|  |  | -				zap.Any("UpdateNeckRingHealth", err),
 | 
	
		
			
				|  |  | -				zap.Any("pasture", pasture),
 | 
	
		
			
				|  |  | -			)
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (e *Entry) UpdateNeckRingHealth(pastureId int64) error {
 | 
	
		
			
				|  |  | -	neckRingConfigureList, err := e.FindSystemNeckRingConfigure(pastureId)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return xerr.WithStack(err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	healthValue := int32(0)
 | 
	
		
			
				|  |  | -	for _, v := range neckRingConfigureList {
 | 
	
		
			
				|  |  | -		if v.Name != model.HealthWarning {
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		healthValue = int32(v.Value)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	newNeckRingHealthWarningList, err := e.FindNewNeckRingHealthWarning(pastureId, healthValue)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return xerr.WithStack(err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if len(newNeckRingHealthWarningList) > 0 {
 | 
	
		
			
				|  |  | -		if err = e.DB.Model(new(model.NeckRingHealthWarning)).
 | 
	
		
			
				|  |  | -			Create(&newNeckRingHealthWarningList).Error; err != nil {
 | 
	
		
			
				|  |  | -			zaplog.Error("UpdateNeckRingHealth",
 | 
	
		
			
				|  |  | -				zap.Any("error", err),
 | 
	
		
			
				|  |  | -				zap.Any("newNeckRingHealthWarningList", newNeckRingHealthWarningList),
 | 
	
		
			
				|  |  | -			)
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  func calculateNewScore(data *model.NeckRingHealth) int32 {
 | 
	
		
			
				|  |  |  	otherScore := int32(0)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -206,85 +152,3 @@ func calculateMilkFilterScore(milkFilter int32, maxHigh int32) int32 {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	return result
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (e *Entry) FindNewNeckRingHealthWarning(pastureId int64, healthValue int32) ([]*model.NeckRingHealthWarning, error) {
 | 
	
		
			
				|  |  | -	nowTime := time.Now().Local()
 | 
	
		
			
				|  |  | -	//endTime := nowTime.Format(model.LayoutDate2)
 | 
	
		
			
				|  |  | -	startTime := nowTime.AddDate(0, 0, -1).Format(model.LayoutDate2)
 | 
	
		
			
				|  |  | -	neckRingHealthList := make([]*model.NeckRingHealth, 0)
 | 
	
		
			
				|  |  | -	if err := e.DB.Model(new(model.NeckRingHealth)).
 | 
	
		
			
				|  |  | -		Select(`MAX(id) AS id,heat_date,neck_ring_number,cow_id,score,max_high,created_at,min_high,min_chew,
 | 
	
		
			
				|  |  | -		min_intake,sum_chew,before_three_sum_chew`).
 | 
	
		
			
				|  |  | -		Where("pasture_id = ?", pastureId).
 | 
	
		
			
				|  |  | -		Where("heat_date >= ?", startTime).
 | 
	
		
			
				|  |  | -		Group("cow_id").
 | 
	
		
			
				|  |  | -		Find(&neckRingHealthList).Error; err != nil {
 | 
	
		
			
				|  |  | -		return nil, xerr.WithStack(err)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	newNeckRingHealthWarningList := make([]*model.NeckRingHealthWarning, 0)
 | 
	
		
			
				|  |  | -	for _, v := range neckRingHealthList {
 | 
	
		
			
				|  |  | -		if v.HeatDate == "" {
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		cowInfo, err := e.GetCowById(pastureId, v.CowId)
 | 
	
		
			
				|  |  | -		if err != nil || cowInfo == nil {
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		newScore := calculateNewScore(v)
 | 
	
		
			
				|  |  | -		zaplog.Info("calculateNewScore",
 | 
	
		
			
				|  |  | -			zap.Any("newScore", newScore),
 | 
	
		
			
				|  |  | -			zap.Any("v", v),
 | 
	
		
			
				|  |  | -			zap.Any("healthValue", healthValue),
 | 
	
		
			
				|  |  | -			zap.Any("cowInfo", cowInfo),
 | 
	
		
			
				|  |  | -		)
 | 
	
		
			
				|  |  | -		if newScore > healthValue {
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		if e.HistoryNeckRingHealthWarning(pastureId, cowInfo.NeckRingNumber, v.HeatDate) {
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		if e.FindNeckRingError(pastureId, cowInfo.NeckRingNumber) {
 | 
	
		
			
				|  |  | -			continue
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		newNeckRingHealthWarning := model.NewNeckRingHealthWarning(pastureId, v, cowInfo, newScore)
 | 
	
		
			
				|  |  | -		zaplog.Info("newNeckRingHealthWarning",
 | 
	
		
			
				|  |  | -			zap.Any("newNeckRingHealthWarning", newNeckRingHealthWarning),
 | 
	
		
			
				|  |  | -			zap.Any("pastureId", pastureId),
 | 
	
		
			
				|  |  | -			zap.Any("neckRingHealth", v),
 | 
	
		
			
				|  |  | -			zap.Any("cowInfo", cowInfo),
 | 
	
		
			
				|  |  | -			zap.Any("newScore", newScore),
 | 
	
		
			
				|  |  | -		)
 | 
	
		
			
				|  |  | -		newNeckRingHealthWarningList = append(newNeckRingHealthWarningList, newNeckRingHealthWarning)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return newNeckRingHealthWarningList, nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (e *Entry) HistoryNeckRingHealthWarning(pastureId int64, neckRingNumber string, heatDate string) bool {
 | 
	
		
			
				|  |  | -	var count int64
 | 
	
		
			
				|  |  | -	if err := e.DB.Model(new(model.NeckRingHealthWarning)).
 | 
	
		
			
				|  |  | -		Where("pasture_id = ?", pastureId).
 | 
	
		
			
				|  |  | -		Where("neck_ring_number = ?", neckRingNumber).
 | 
	
		
			
				|  |  | -		Where("heat_date = ?", heatDate).
 | 
	
		
			
				|  |  | -		Where("is_show = ?", pasturePb.IsShow_Ok).
 | 
	
		
			
				|  |  | -		Count(&count).Error; err != nil {
 | 
	
		
			
				|  |  | -		return false
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return count > 0
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (e *Entry) FindNeckRingError(pastureId int64, neckRingNumber string) bool {
 | 
	
		
			
				|  |  | -	var count int64
 | 
	
		
			
				|  |  | -	if err := e.DB.Model(new(model.NeckRing)).
 | 
	
		
			
				|  |  | -		Where("pasture_id = ?", pastureId).
 | 
	
		
			
				|  |  | -		Where("neck_ring_number = ?", neckRingNumber).
 | 
	
		
			
				|  |  | -		Where("status = ?", pasturePb.IsShow_No).
 | 
	
		
			
				|  |  | -		Where("error_kind = ?", pasturePb.NeckRingNumberError_Suspected_Fall_Off).
 | 
	
		
			
				|  |  | -		Count(&count).Error; err != nil {
 | 
	
		
			
				|  |  | -		return false
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return count > 0
 | 
	
		
			
				|  |  | -}
 |