|
@@ -3,23 +3,47 @@ package crontab
|
|
|
import (
|
|
|
"fmt"
|
|
|
"kpt-pasture/model"
|
|
|
+ "sort"
|
|
|
|
|
|
"gitee.com/xuyiping_admin/pkg/logger/zaplog"
|
|
|
"go.uber.org/zap"
|
|
|
)
|
|
|
|
|
|
+func (e *Entry) UpdatePenBehavior() error {
|
|
|
+ pastureList := e.FindPastureList()
|
|
|
+ if pastureList == nil || len(pastureList) == 0 {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, pasture := range pastureList {
|
|
|
+ conf, err := e.GetSystemNeckRingConfigure(pasture.Id, model.MaxPenBehavior)
|
|
|
+ if err != nil {
|
|
|
+ zaplog.Error("UpdatePenBehavior", zap.Any("pasture", pasture), zap.Any("err", err))
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ e.PenBehavior(pasture.Id, conf.Value)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
-func (e *Entry) PenBehavior(pastureId int64, processIds []int64) error {
|
|
|
+func (e *Entry) PenBehavior(pastureId, maxPenBehavior int64) {
|
|
|
|
|
|
- neckRingOriginalList, err := e.getNeckRingOriginalList(pastureId, processIds)
|
|
|
+ neckRingOriginalList, err := e.getNeckRingOriginalList(pastureId, maxPenBehavior)
|
|
|
if err != nil {
|
|
|
- return fmt.Errorf("获取颈环原始数据失败: %w", err)
|
|
|
+ zaplog.Error("PenBehavior", zap.Any("pastureId", pastureId), zap.Any("maxPenBehavior", maxPenBehavior), zap.Any("err", err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(neckRingOriginalList) <= 0 {
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
|
|
|
cowMap, err := e.getCowMap(pastureId, neckRingOriginalList)
|
|
|
if err != nil {
|
|
|
- return fmt.Errorf("获取牛只信息失败: %w", err)
|
|
|
+ zaplog.Error("PenBehavior", zap.Any("pastureId", pastureId), zap.Any("neckRingOriginalList", neckRingOriginalList), zap.Any("err", err))
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
|
|
@@ -29,19 +53,27 @@ func (e *Entry) PenBehavior(pastureId int64, processIds []int64) error {
|
|
|
e.calculateAveragesAndRates(penData)
|
|
|
|
|
|
|
|
|
- if err := e.savePenBehaviorData(penData); err != nil {
|
|
|
- return fmt.Errorf("保存栏舍行为数据失败: %w", err)
|
|
|
+ if err = e.savePenBehaviorData(penData); err != nil {
|
|
|
+ zaplog.Error("PenBehavior", zap.Any("penData", penData), zap.Any("err", err))
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
- return nil
|
|
|
+ sort.Slice(neckRingOriginalList, func(i, j int) bool {
|
|
|
+ return neckRingOriginalList[i].Id > neckRingOriginalList[j].Id
|
|
|
+ })
|
|
|
+
|
|
|
+ if err = e.UpdateSystemNeckRingConfigure(pastureId, model.MaxPenBehavior, neckRingOriginalList[0].Id); err != nil {
|
|
|
+ zaplog.Error("PenBehavior", zap.Any("UpdateSystemNeckRingConfigure", err), zap.Any("neckRingOriginalList", neckRingOriginalList))
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
-func (e *Entry) getNeckRingOriginalList(pastureId int64, processIds []int64) ([]*model.NeckRingOriginal, error) {
|
|
|
+func (e *Entry) getNeckRingOriginalList(pastureId, maxPenBehavior int64) ([]*model.NeckRingOriginal, error) {
|
|
|
var neckRingOriginalList []*model.NeckRingOriginal
|
|
|
if err := e.DB.Model(new(model.NeckRingOriginal)).
|
|
|
- Where("id IN (?) AND pasture_id = ?", processIds, pastureId).
|
|
|
- Order("heat_date,neck_ring_number,frameid").
|
|
|
+ Where("id > ? AND pasture_id = ?", maxPenBehavior, pastureId).
|
|
|
+ Order("active_date,neck_ring_number,frameid").
|
|
|
+ Limit(int(defaultLimit)).
|
|
|
Find(&neckRingOriginalList).Error; err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
@@ -113,7 +145,7 @@ func (e *Entry) calculateAveragesAndRates(penData map[string]*model.PenBehaviorD
|
|
|
for _, data := range penData {
|
|
|
|
|
|
data.AvgHigh = data.AvgHigh / data.CowCount
|
|
|
-
|
|
|
+
|
|
|
|
|
|
if data.CowCount > 0 {
|
|
|
data.RuminaRate = int32(float64(data.SumRumina) / float64(data.CowCount) * 100)
|
|
@@ -129,7 +161,7 @@ func (e *Entry) savePenBehaviorData(penData map[string]*model.PenBehaviorData) e
|
|
|
for _, data := range penData {
|
|
|
|
|
|
activeTime := e.calculateActiveTime(data.HeatDate, data.Frameid)
|
|
|
-
|
|
|
+
|
|
|
|
|
|
penBehavior := &model.PenBehavior{
|
|
|
PastureId: data.PastureId,
|
|
@@ -154,16 +186,16 @@ func (e *Entry) savePenBehaviorData(penData map[string]*model.PenBehaviorData) e
|
|
|
Where("pasture_id = ? AND heat_date = ? AND pen_id = ? AND active_time = ?",
|
|
|
penBehavior.PastureId, penBehavior.HeatDate, penBehavior.PenId, penBehavior.ActiveTime).
|
|
|
Assign(map[string]interface{}{
|
|
|
- "cow_count": penBehavior.CowCount,
|
|
|
- "avg_high": penBehavior.AvgHigh,
|
|
|
- "sum_rumina": penBehavior.SumRumina,
|
|
|
- "sum_intake": penBehavior.SumIntake,
|
|
|
- "sum_rest": penBehavior.SumRest,
|
|
|
- "sum_gasp": penBehavior.SumGasp,
|
|
|
- "rumina_rate": penBehavior.RuminaRate,
|
|
|
- "intake_rate": penBehavior.IntakeRate,
|
|
|
- "rest_rate": penBehavior.RestRate,
|
|
|
- "gasp_rate": penBehavior.GaspRate,
|
|
|
+ "cow_count": penBehavior.CowCount,
|
|
|
+ "avg_high": penBehavior.AvgHigh,
|
|
|
+ "sum_rumina": penBehavior.SumRumina,
|
|
|
+ "sum_intake": penBehavior.SumIntake,
|
|
|
+ "sum_rest": penBehavior.SumRest,
|
|
|
+ "sum_gasp": penBehavior.SumGasp,
|
|
|
+ "rumina_rate": penBehavior.RuminaRate,
|
|
|
+ "intake_rate": penBehavior.IntakeRate,
|
|
|
+ "rest_rate": penBehavior.RestRate,
|
|
|
+ "gasp_rate": penBehavior.GaspRate,
|
|
|
}).
|
|
|
FirstOrCreate(penBehavior).Error; err != nil {
|
|
|
return err
|
|
@@ -176,8 +208,8 @@ func (e *Entry) savePenBehaviorData(penData map[string]*model.PenBehaviorData) e
|
|
|
func (e *Entry) calculateActiveTime(heatDate string, frameid int32) string {
|
|
|
|
|
|
hour := (frameid / 10) * 2
|
|
|
- minute := (frameid % 10) * 20 - 1
|
|
|
-
|
|
|
+ minute := (frameid%10)*20 - 1
|
|
|
+
|
|
|
|
|
|
return fmt.Sprintf("%s %02d:%02d", heatDate, hour, minute)
|
|
|
}
|