123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- 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
- }
- }
- }
|