package crontab import ( "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" ) func (e *Entry) UpdateMilkCyclBar(pastureId int64, milkClassConfig *MilkClassConfig, hall *model.MilkHall) { // 遍历4个班次 for shifts := int32(1); shifts <= 4; shifts++ { // 1. 查询挤奶牛舍信息 // 查询条件:同一牧场、同一奶厅、同一班次、nattach=1、cow_id>0 milkOriginalList := make([]*model.MilkOriginal, 0) if err := e.DB.Model(new(model.MilkOriginal)). Where("pasture_id = ?", pastureId). Where("milk_hall_number = ?", hall.Name). Where("shifts = ?", shifts). Where("nattach = ?", 1). Where("cow_id > ?", 0). Where("id BETWEEN ? AND ?", milkClassConfig.OldUpdateMaxId+1, milkClassConfig.CurrentMaxId). Order("load_address"). Find(&milkOriginalList).Error; err != nil { zaplog.Error("UpdateMilkCyclBar", zap.Any("err", err)) return } // 如果没有数据,直接进入下一班次 if len(milkOriginalList) == 0 { continue } // 2. 计算牛舍信息 // 初始化变量 //var currentPenName = "" var currentPenId int32 = 0 var count int = 0 var barId int32 = 0 // 创建牛舍信息映射 barInfoMap := make(map[int32]map[string]interface{}) loadAddressMap := make(map[int64]int32) // 遍历记录,计算牛舍信息 for _, record := range milkOriginalList { // 计算load_address loadAddress := int64(record.Load*100) + record.DetachedAddress // 如果intBarCode变化,重置计数器 if record.PenId != currentPenId { count = 1 //currentPenName = record.PenName currentPenId = record.PenId } else { count++ } // 如果连续7头牛以上,记录为牛舍 if count >= 7 { barId++ barInfoMap[barId] = map[string]interface{}{ "pen_name": record.PenName, "pen_id": record.PenId, "load": record.Load, "load_address": loadAddress, } loadAddressMap[loadAddress] = barId } } // 如果没有牛舍信息,直接进入下一班次 if len(barInfoMap) == 0 { continue } // 3. 更新牛舍信息 // 获取第一个牛舍信息 firstPenId := int32(1) firstBarInfo := barInfoMap[firstPenId] firstPenName := firstBarInfo["pen_name"].(string) firstPenId = firstBarInfo["pen_id"].(int32) // 遍历牛舍信息,更新记录 for i := 2; i <= len(barInfoMap); i++ { // 获取当前牛舍信息 currentBarInfo := barInfoMap[int32(i)] currentVarBarCode := currentBarInfo["pen_name"].(string) currentIntBarCode := currentBarInfo["pen_id"].(int32) currentLoadAddress := currentBarInfo["load_address"].(int64) // 计算上一个牛舍的结束地址 var lastLoadAddress int64 = 0 for _, record := range milkOriginalList { loadAddress := int64(record.Load*100) + record.DetachedAddress if loadAddress < currentLoadAddress && record.PenName == currentVarBarCode { // 计算连续4头牛的位置 if record.PenName == currentVarBarCode { count++ if count == 4 { lastLoadAddress = loadAddress - 3 break } } else { count = 1 } } } // 更新上一个牛舍的记录 if lastLoadAddress > 0 { if err := e.DB.Model(new(model.MilkOriginal)). Where("pasture_id = ?", pastureId). Where("milk_hall_number = ?", hall.Name). Where("shifts = ?", shifts). Where("nattach = ?", 1). Where("cow_id > ?", 0). Where("var_bar_milked IS NULL"). Where("(load * 100 + detached_address) < ?", lastLoadAddress). Where("id BETWEEN ? AND ?", milkClassConfig.OldUpdateMaxId+1, milkClassConfig.CurrentMaxId). Updates(map[string]interface{}{ "pen_name": firstPenName, "pen_id": firstPenId, }).Error; err != nil { zaplog.Error("UpdateMilkCyclBar", zap.Any("err", err)) return } } // 更新当前牛舍信息 firstPenName = currentVarBarCode firstPenId = currentIntBarCode } // 4. 更新最后一个牛舍的记录 // 获取最后一个牛舍的最大load_address var maxLoadAddress int64 = 0 for _, record := range milkOriginalList { loadAddress := int64(record.Load*100) + record.DetachedAddress if record.PenName == firstPenName && record.PenId == firstPenId && record.PenName == "" { if loadAddress > maxLoadAddress { maxLoadAddress = loadAddress } } } // 更新最后一个牛舍的记录 if maxLoadAddress > 0 { if err := e.DB.Model(new(model.MilkOriginal)). Where("pasture_id = ?", pastureId). Where("milk_hall_number = ?", hall.Name). Where("shifts = ?", shifts). Where("var_bar_milked IS NULL"). Where("(load * 100 + detached_address) <= ?", maxLoadAddress). Where("id BETWEEN ? AND ?", milkClassConfig.OldUpdateMaxId+1, milkClassConfig.CurrentMaxId). Updates(map[string]interface{}{ "pen_name": firstPenName, "pen_id": firstPenId, }).Error; err != nil { zaplog.Error("UpdateMilkCyclBar", zap.Any("err", err)) return } } // 5. 更新未识别的记录 if err := e.DB.Model(new(model.MilkOriginal)). Where("pasture_id = ?", pastureId). Where("milk_hall_number = ?", hall.Name). Where("shifts = ?", shifts). Where("var_bar_milked IS NULL"). Where("id BETWEEN ? AND ?", milkClassConfig.OldUpdateMaxId+1, milkClassConfig.CurrentMaxId). Updates(map[string]interface{}{ "is_identify": pasturePb.IsShow_No, }).Error; err != nil { zaplog.Error("UpdateMilkCyclBar", zap.Any("err", err)) return } } }