123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package crontab
- import (
- "fmt"
- "kpt-pasture/model"
- "gitee.com/xuyiping_admin/pkg/logger/zaplog"
- "go.uber.org/zap"
- )
- // PenBehavior 栏舍行为曲线
- func (e *Entry) PenBehavior(pastureId int64, processIds []int64) error {
- // 1. 获取颈环原始数据
- neckRingOriginalList, err := e.getNeckRingOriginalList(pastureId, processIds)
- if err != nil {
- return fmt.Errorf("获取颈环原始数据失败: %w", err)
- }
- // 2. 获取牛只信息
- cowMap, err := e.getCowMap(pastureId, neckRingOriginalList)
- if err != nil {
- return fmt.Errorf("获取牛只信息失败: %w", err)
- }
- // 3. 处理栏舍行为数据
- penData := e.processPenBehaviorData(neckRingOriginalList, cowMap)
- // 4. 计算平均值
- e.calculateAverages(penData)
- return nil
- }
- // getNeckRingOriginalList 获取颈环原始数据
- func (e *Entry) getNeckRingOriginalList(pastureId int64, processIds []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").
- Find(&neckRingOriginalList).Error; err != nil {
- return nil, err
- }
- return neckRingOriginalList, nil
- }
- // getCowMap 获取牛只信息映射
- func (e *Entry) getCowMap(pastureId int64, neckRingOriginalList []*model.NeckRingOriginal) (map[string]*model.Cow, error) {
- // 提取牛只ID
- cowIds := make([]int64, 0, len(neckRingOriginalList))
- for _, v := range neckRingOriginalList {
- cowIds = append(cowIds, v.Id)
- }
- // 获取牛只信息
- cowInfoList, err := e.GetCowByIds(pastureId, cowIds)
- if err != nil {
- return nil, err
- }
- // 构建牛只信息映射
- cowMap := make(map[string]*model.Cow, len(cowInfoList))
- for _, v := range cowInfoList {
- if v.NeckRingNumber == "" {
- continue
- }
- cowMap[v.NeckRingNumber] = v
- }
- return cowMap, nil
- }
- // processPenBehaviorData 处理栏舍行为数据
- func (e *Entry) processPenBehaviorData(neckRingOriginalList []*model.NeckRingOriginal, cowMap map[string]*model.Cow) map[string]*model.PenBehaviorData {
- penData := make(map[string]*model.PenBehaviorData, len(neckRingOriginalList))
- for _, v := range neckRingOriginalList {
- cowInfo, ok := cowMap[v.NeckRingNumber]
- if !ok {
- zaplog.Error("PenBehavior", zap.Any("neckRingNumber", v.NeckRingNumber))
- continue
- }
- key := fmt.Sprintf("%s_%d_%d", v.ActiveDate, cowInfo.PenId, v.Frameid)
- if data, exists := penData[key]; exists {
- data.CowCount++
- data.AvgHigh += v.High
- data.SumRumina += ifThenElse(v.Rumina >= 8, 1, 0)
- data.SumIntake += ifThenElse(v.Intake >= 8, 1, 0)
- data.SumRest += ifThenElse(v.Inactive >= 8, 1, 0)
- data.SumGasp += ifThenElse(v.Gasp >= 8, 1, 0)
- } else {
- penData[key] = &model.PenBehaviorData{
- PastureId: cowInfo.PastureId,
- PenId: cowInfo.PenId,
- PenName: cowInfo.PenName,
- HeatDate: v.ActiveDate,
- Frameid: v.Frameid,
- CowCount: 1,
- AvgHigh: v.High,
- }
- }
- }
- return penData
- }
- // calculateAverages 计算平均值
- func (e *Entry) calculateAverages(penData map[string]*model.PenBehaviorData) {
- for _, data := range penData {
- data.AvgHigh = data.AvgHigh / data.CowCount
- }
- }
- // ifThenElse 条件判断函数
- func ifThenElse(condition bool, a, b int32) int32 {
- if condition {
- return a
- }
- return b
- }
|