neck_ring_estrus_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package crontab
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "math"
  6. "gorm.io/driver/mysql"
  7. "gorm.io/gorm"
  8. )
  9. type HActiveHabit struct {
  10. ID uint
  11. IntPastureID uint
  12. IntCowID uint
  13. VarCowCode string
  14. IntCurFetal uint
  15. DIM uint
  16. Createtime sql.NullString
  17. Changeadjust uint
  18. Changefilter uint
  19. Filtercorrect float64
  20. Ruminafilter int
  21. Filterhigh uint
  22. Heatdate sql.NullString
  23. }
  24. func main() {
  25. dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  26. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  27. if err != nil {
  28. panic("failed to connect database")
  29. }
  30. // 假设这些变量是从外部传入的
  31. xbegactid, xendactid := uint(1), uint(100)
  32. xPastuId := uint(123)
  33. xthatdate := "2023-10-01"
  34. xactlevellow := float64(10)
  35. xadjust21 := float64(2)
  36. maxruminaadjust := int(10)
  37. rumtoheat := float64(0.5) // 假设值
  38. var habits []HActiveHabit
  39. db.Where("id BETWEEN ? AND ? AND int_pasture_id = ? AND heatdate = ?", xbegactid, xendactid, xPastuId, xthatdate).
  40. Find(&habits)
  41. var results []struct {
  42. IntPastureID uint
  43. IntCowID uint
  44. VarCowCode string
  45. IntCurFetal uint
  46. DIM uint
  47. Createtime string
  48. CFT float64
  49. High uint
  50. }
  51. cowMap := make(map[uint][]HActiveHabit)
  52. for _, habit := range habits {
  53. cowMap[habit.IntCowID] = append(cowMap[habit.IntCowID], habit)
  54. }
  55. for cowID, habits := range cowMap {
  56. var createtime string
  57. var cft float64
  58. var high uint
  59. if len(habits) > 0 {
  60. sortedHabits := sortHabitsByChangefilterDesc(habits)
  61. createtime = sortedHabits[0].Createtime.String
  62. maxCft := float64(-math.MaxFloat64)
  63. for _, habit := range sortedHabits {
  64. adjustedValue := calculateAdjustedValue(habit, maxruminaadjust, rumtoheat)
  65. if adjustedValue > maxCft {
  66. maxCft = adjustedValue
  67. high = habit.Filterhigh
  68. }
  69. }
  70. cft = round(maxCft)
  71. }
  72. if cft >= (xactlevellow - xadjust21) {
  73. anyDimValid := false
  74. for _, habit := range habits {
  75. if habit.DIM >= 20 || habit.IntCurFetal == 0 {
  76. anyDimValid = true
  77. break
  78. }
  79. }
  80. if anyDimValid {
  81. results = append(results, struct {
  82. IntPastureID uint
  83. IntCowID uint
  84. VarCowCode string
  85. IntCurFetal uint
  86. DIM uint
  87. Createtime string
  88. CFT float64
  89. High uint
  90. }{
  91. IntPastureID: habits[0].IntPastureID,
  92. IntCowID: cowID,
  93. VarCowCode: habits[0].VarCowCode,
  94. IntCurFetal: habits[0].IntCurFetal,
  95. DIM: habits[0].DIM,
  96. Createtime: createtime,
  97. CFT: cft,
  98. High: high,
  99. })
  100. }
  101. }
  102. }
  103. for _, result := range results {
  104. fmt.Printf("IntPastureID: %d, IntCowID: %d, VarCowCode: %s, IntCurFetal: %d, DIM: %d, Createtime: %s, CFT: %.2f, High: %d\n",
  105. result.IntPastureID, result.IntCowID, result.VarCowCode, result.IntCurFetal, result.DIM, result.Createtime, result.CFT, result.High)
  106. }
  107. }
  108. func sortHabitsByChangefilterDesc(habits []HActiveHabit) []HActiveHabit {
  109. sorted := make([]HActiveHabit, len(habits))
  110. copy(sorted, habits)
  111. for i := range sorted {
  112. for j := i + 1; j < len(sorted); j++ {
  113. if sorted[i].Changefilter < sorted[j].Changefilter {
  114. sorted[i], sorted[j] = sorted[j], sorted[i]
  115. }
  116. }
  117. }
  118. return sorted
  119. }
  120. func calculateAdjustedValue(habit HActiveHabit, maxruminaadjust int, rumtoheat float64) float64 {
  121. baseValue := float64(0)
  122. if habit.Changeadjust >= 10 {
  123. baseValue = float64(habit.Changefilter-habit.Changeadjust+3) * habit.Filtercorrect / 100
  124. } else {
  125. baseValue = float64(habit.Changefilter) * habit.Filtercorrect / 100
  126. }
  127. ruminaAdjustment := float64(0)
  128. if habit.Ruminafilter > maxruminaadjust {
  129. ruminaAdjustment = 5
  130. } else if habit.Ruminafilter > 0 {
  131. ruminaAdjustment = float64(habit.Ruminafilter) * 0.25
  132. } else if habit.Ruminafilter < -maxruminaadjust {
  133. ruminaAdjustment = float64(-maxruminaadjust) * rumtoheat
  134. } else {
  135. ruminaAdjustment = float64(habit.Ruminafilter) * rumtoheat
  136. }
  137. return baseValue - ruminaAdjustment
  138. }
  139. func round(value float64) float64 {
  140. return math.Round(value*100) / 100
  141. }