12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package crontab
- import (
- "fmt"
- "kpt-pasture/model"
- "math"
- "sort"
- "time"
- "gitee.com/xuyiping_admin/pkg/logger/zaplog"
- "go.uber.org/zap"
- )
- // UpdateCowWeeklyHigh 更新牛只周活动量
- func (e *Entry) UpdateCowWeeklyHigh(pastureId int64, cow *model.Cow) int32 {
- highData, err := e.GetSystemNeckRingConfigure(pastureId, model.High)
- if err != nil || highData == nil || highData.Value <= 0 {
- return 0
- }
- minWeeklyActive, er := e.GetSystemNeckRingConfigure(pastureId, model.MinWeeklyActive)
- if er != nil || minWeeklyActive == nil || minWeeklyActive.Value <= 0 {
- return 0
- }
- weeklyActiveModelList := make([]*model.WeeklyActiveModel, 0)
- nowTime := time.Now().Local()
- startTime := nowTime.AddDate(0, 0, -7).Format(model.LayoutDate2)
- endTime := nowTime.AddDate(0, 0, -1).Format(model.LayoutDate2)
- selectStr := fmt.Sprintf(`cow_id,heat_date,count(1) AS nb,IF(ROUND(AVG(high))>%d, ROUND(AVG(high)), %d) AS high`, minWeeklyActive.Value, minWeeklyActive.Value)
- if err = e.DB.Model(new(model.NeckActiveHabit)).
- Select(selectStr).
- Where("pasture_id = ?", pastureId).
- Where("cow_id = ?", cow.Id).
- Where("heat_date BETWEEN ? AND ?", startTime, endTime).
- Where("high > ?", highData.Value).
- Having("nb > ?", 8).
- Order("high").
- Group("heat_date").
- Find(&weeklyActiveModelList).Error; err != nil {
- zaplog.Error("crontab", zap.Any("UpdateCowWeeklyHigh", err))
- return 0
- }
- if len(weeklyActiveModelList) < 3 {
- return 0
- }
- // 1. 先按High值排序
- sort.Slice(weeklyActiveModelList, func(i, j int) bool {
- return weeklyActiveModelList[i].High < weeklyActiveModelList[j].High
- })
- countHigh := len(weeklyActiveModelList)
- sumHigh := int32(0)
- minHigh := weeklyActiveModelList[0].High
- maxHigh := weeklyActiveModelList[countHigh-1].High
- for _, v := range weeklyActiveModelList {
- sumHigh += v.High
- }
- diff := 0
- x := int32(0)
- if countHigh > 3 {
- diff = 3
- x = weeklyActiveModelList[1].High
- } else if countHigh == 3 {
- diff = 2
- } else {
- return 0
- }
- avgHigh := float64(sumHigh-minHigh-maxHigh-x) / float64(countHigh-diff)
- return int32(math.Round(avgHigh))
- }
|