milk_original_update_gea_cycl_bar.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package crontab
  2. import (
  3. "kpt-pasture/model"
  4. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  5. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  6. "go.uber.org/zap"
  7. )
  8. func (e *Entry) UpdateMilkCyclBar(pastureId int64, milkClassConfig *MilkClassConfig, hall *model.MilkHall) {
  9. // 遍历4个班次
  10. for shifts := int32(1); shifts <= 4; shifts++ {
  11. // 1. 查询挤奶牛舍信息
  12. // 查询条件:同一牧场、同一奶厅、同一班次、nattach=1、cow_id>0
  13. milkOriginalList := make([]*model.MilkOriginal, 0)
  14. if err := e.DB.Model(new(model.MilkOriginal)).
  15. Where("pasture_id = ?", pastureId).
  16. Where("milk_hall_number = ?", hall.Name).
  17. Where("shifts = ?", shifts).
  18. Where("nattach = ?", 1).
  19. Where("cow_id > ?", 0).
  20. Where("id BETWEEN ? AND ?", milkClassConfig.OldUpdateMaxId+1, milkClassConfig.CurrentMaxId).
  21. Order("load_address").
  22. Find(&milkOriginalList).Error; err != nil {
  23. zaplog.Error("UpdateMilkCyclBar", zap.Any("err", err))
  24. return
  25. }
  26. // 如果没有数据,直接进入下一班次
  27. if len(milkOriginalList) == 0 {
  28. continue
  29. }
  30. // 2. 计算牛舍信息
  31. // 初始化变量
  32. //var currentPenName = ""
  33. var currentPenId int32 = 0
  34. var count int = 0
  35. var barId int32 = 0
  36. // 创建牛舍信息映射
  37. barInfoMap := make(map[int32]map[string]interface{})
  38. loadAddressMap := make(map[int64]int32)
  39. // 遍历记录,计算牛舍信息
  40. for _, record := range milkOriginalList {
  41. // 计算load_address
  42. loadAddress := int64(record.Load*100) + record.DetachedAddress
  43. // 如果intBarCode变化,重置计数器
  44. if record.PenId != currentPenId {
  45. count = 1
  46. //currentPenName = record.PenName
  47. currentPenId = record.PenId
  48. } else {
  49. count++
  50. }
  51. // 如果连续7头牛以上,记录为牛舍
  52. if count >= 7 {
  53. barId++
  54. barInfoMap[barId] = map[string]interface{}{
  55. "pen_name": record.PenName,
  56. "pen_id": record.PenId,
  57. "load": record.Load,
  58. "load_address": loadAddress,
  59. }
  60. loadAddressMap[loadAddress] = barId
  61. }
  62. }
  63. // 如果没有牛舍信息,直接进入下一班次
  64. if len(barInfoMap) == 0 {
  65. continue
  66. }
  67. // 3. 更新牛舍信息
  68. // 获取第一个牛舍信息
  69. firstPenId := int32(1)
  70. firstBarInfo := barInfoMap[firstPenId]
  71. firstPenName := firstBarInfo["pen_name"].(string)
  72. firstPenId = firstBarInfo["pen_id"].(int32)
  73. // 遍历牛舍信息,更新记录
  74. for i := 2; i <= len(barInfoMap); i++ {
  75. // 获取当前牛舍信息
  76. currentBarInfo := barInfoMap[int32(i)]
  77. currentVarBarCode := currentBarInfo["pen_name"].(string)
  78. currentIntBarCode := currentBarInfo["pen_id"].(int32)
  79. currentLoadAddress := currentBarInfo["load_address"].(int64)
  80. // 计算上一个牛舍的结束地址
  81. var lastLoadAddress int64 = 0
  82. for _, record := range milkOriginalList {
  83. loadAddress := int64(record.Load*100) + record.DetachedAddress
  84. if loadAddress < currentLoadAddress && record.PenName == currentVarBarCode {
  85. // 计算连续4头牛的位置
  86. if record.PenName == currentVarBarCode {
  87. count++
  88. if count == 4 {
  89. lastLoadAddress = loadAddress - 3
  90. break
  91. }
  92. } else {
  93. count = 1
  94. }
  95. }
  96. }
  97. // 更新上一个牛舍的记录
  98. if lastLoadAddress > 0 {
  99. if err := e.DB.Model(new(model.MilkOriginal)).
  100. Where("pasture_id = ?", pastureId).
  101. Where("milk_hall_number = ?", hall.Name).
  102. Where("shifts = ?", shifts).
  103. Where("nattach = ?", 1).
  104. Where("cow_id > ?", 0).
  105. Where("var_bar_milked IS NULL").
  106. Where("(load * 100 + detached_address) < ?", lastLoadAddress).
  107. Where("id BETWEEN ? AND ?", milkClassConfig.OldUpdateMaxId+1, milkClassConfig.CurrentMaxId).
  108. Updates(map[string]interface{}{
  109. "pen_name": firstPenName,
  110. "pen_id": firstPenId,
  111. }).Error; err != nil {
  112. zaplog.Error("UpdateMilkCyclBar", zap.Any("err", err))
  113. return
  114. }
  115. }
  116. // 更新当前牛舍信息
  117. firstPenName = currentVarBarCode
  118. firstPenId = currentIntBarCode
  119. }
  120. // 4. 更新最后一个牛舍的记录
  121. // 获取最后一个牛舍的最大load_address
  122. var maxLoadAddress int64 = 0
  123. for _, record := range milkOriginalList {
  124. loadAddress := int64(record.Load*100) + record.DetachedAddress
  125. if record.PenName == firstPenName && record.PenId == firstPenId && record.PenName == "" {
  126. if loadAddress > maxLoadAddress {
  127. maxLoadAddress = loadAddress
  128. }
  129. }
  130. }
  131. // 更新最后一个牛舍的记录
  132. if maxLoadAddress > 0 {
  133. if err := e.DB.Model(new(model.MilkOriginal)).
  134. Where("pasture_id = ?", pastureId).
  135. Where("milk_hall_number = ?", hall.Name).
  136. Where("shifts = ?", shifts).
  137. Where("var_bar_milked IS NULL").
  138. Where("(load * 100 + detached_address) <= ?", maxLoadAddress).
  139. Where("id BETWEEN ? AND ?", milkClassConfig.OldUpdateMaxId+1, milkClassConfig.CurrentMaxId).
  140. Updates(map[string]interface{}{
  141. "pen_name": firstPenName,
  142. "pen_id": firstPenId,
  143. }).Error; err != nil {
  144. zaplog.Error("UpdateMilkCyclBar", zap.Any("err", err))
  145. return
  146. }
  147. }
  148. // 5. 更新未识别的记录
  149. if err := e.DB.Model(new(model.MilkOriginal)).
  150. Where("pasture_id = ?", pastureId).
  151. Where("milk_hall_number = ?", hall.Name).
  152. Where("shifts = ?", shifts).
  153. Where("var_bar_milked IS NULL").
  154. Where("id BETWEEN ? AND ?", milkClassConfig.OldUpdateMaxId+1, milkClassConfig.CurrentMaxId).
  155. Updates(map[string]interface{}{
  156. "is_identify": pasturePb.IsShow_No,
  157. }).Error; err != nil {
  158. zaplog.Error("UpdateMilkCyclBar", zap.Any("err", err))
  159. return
  160. }
  161. }
  162. }