cow_indicators_breed.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. package crontab
  2. import (
  3. "fmt"
  4. "kpt-pasture/model"
  5. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  6. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  7. "go.uber.org/zap"
  8. )
  9. // FindCalvingNumber 产犊事件总数
  10. func (e *Entry) FindCalvingNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  11. res := make(map[int64]string)
  12. for _, pasture := range pastureList {
  13. var count int64
  14. if err := e.DB.Model(new(model.EventSale)).
  15. Where("pasture_id = ?", pasture.Id).
  16. Where("status = ?", pasturePb.IsShow_Ok).
  17. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  18. Count(&count).Error; err != nil {
  19. zaplog.Error("FindCalvingNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  20. }
  21. res[pasture.Id] = fmt.Sprintf("%d", count)
  22. }
  23. return res
  24. }
  25. // LactationCow 泌乳牛头数 干奶牛头数 后备牛头数
  26. func (e *Entry) LactationCow(pastureList []*model.AppPastureList, milkKind pasturePb.CowMilk_Kind) map[int64]string {
  27. res := make(map[int64]string)
  28. for _, pasture := range pastureList {
  29. var count int64
  30. if err := e.DB.Model(new(model.Cow)).
  31. Where("pasture_id = ?", pasture.Id).
  32. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  33. Where("milk_kind = ?", milkKind).
  34. Count(&count).Error; err != nil {
  35. zaplog.Error("LactationCow", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  36. }
  37. res[pasture.Id] = fmt.Sprintf("%d", count)
  38. }
  39. return res
  40. }
  41. // FirstBornSurvivalRate 头胎接产成活率
  42. func (e *Entry) FirstBornSurvivalRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  43. res := make(map[int64]string)
  44. for _, pasture := range pastureList {
  45. eventCalvingList := make([]*model.EventCalving, 0)
  46. if err := e.DB.Model(new(model.EventCalving)).
  47. Where("pasture_id = ?", pasture.Id).
  48. Where("status = ?", pasturePb.IsShow_Ok).
  49. Where("lact = ?", 0).
  50. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  51. Find(&eventCalvingList).Error; err != nil {
  52. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  53. }
  54. calvingIds := make([]int64, 0)
  55. for _, v := range eventCalvingList {
  56. calvingIds = append(calvingIds, v.Id)
  57. }
  58. var allLiveCow int64
  59. if err := e.DB.Model(new(model.CalvingCalf)).
  60. Select("count(*) as all_live_cow").
  61. Where("pasture_id = ?", pasture.Id).
  62. Where("calving_id IN (?)", calvingIds).
  63. Where("is_live = ?", pasturePb.IsShow_Ok).
  64. Where("birth_at BETWEEN ? AND ?", startAt, endAt).
  65. Scan(&allLiveCow).Error; err != nil {
  66. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  67. }
  68. allCowCalving := len(eventCalvingList)
  69. if allCowCalving > 0 {
  70. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allLiveCow)/float64(allCowCalving))
  71. } else {
  72. res[pasture.Id] = "0"
  73. }
  74. }
  75. return res
  76. }
  77. // FirstBornDeathRate 头胎接产死亡率
  78. func (e *Entry) FirstBornDeathRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  79. res := make(map[int64]string)
  80. for _, pasture := range pastureList {
  81. eventCalvingList := make([]*model.EventCalving, 0)
  82. if err := e.DB.Model(new(model.EventCalving)).
  83. Where("pasture_id = ?", pasture.Id).
  84. Where("status = ?", pasturePb.IsShow_Ok).
  85. Where("lact = ?", 0).
  86. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  87. Find(&eventCalvingList).Error; err != nil {
  88. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  89. }
  90. calvingIds := make([]int64, 0)
  91. for _, v := range eventCalvingList {
  92. calvingIds = append(calvingIds, v.Id)
  93. }
  94. var allDeathCow int64
  95. if err := e.DB.Model(new(model.CalvingCalf)).
  96. Select("count(*) as all_live_cow").
  97. Where("pasture_id = ?", pasture.Id).
  98. Where("calving_id IN (?)", calvingIds).
  99. Where("is_live = ?", pasturePb.IsShow_No).
  100. Where("birth_at BETWEEN ? AND ?", startAt, endAt).
  101. Scan(&allDeathCow).Error; err != nil {
  102. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  103. }
  104. allCowCalving := len(eventCalvingList)
  105. if allCowCalving > 0 {
  106. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allDeathCow)/float64(allCowCalving))
  107. } else {
  108. res[pasture.Id] = "0"
  109. }
  110. }
  111. return res
  112. }
  113. // MultiparitySurvivalRate 经产牛接产成活率
  114. func (e *Entry) MultiparitySurvivalRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  115. res := make(map[int64]string)
  116. for _, pasture := range pastureList {
  117. eventCalvingList := make([]*model.EventCalving, 0)
  118. if err := e.DB.Model(new(model.EventCalving)).
  119. Where("pasture_id = ?", pasture.Id).
  120. Where("status = ?", pasturePb.IsShow_Ok).
  121. Where("lact > ?", 0).
  122. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  123. Find(&eventCalvingList).Error; err != nil {
  124. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  125. }
  126. calvingIds := make([]int64, 0)
  127. for _, v := range eventCalvingList {
  128. calvingIds = append(calvingIds, v.Id)
  129. }
  130. var allLiveCow int64
  131. if err := e.DB.Model(new(model.CalvingCalf)).
  132. Select("count(*) as all_live_cow").
  133. Where("pasture_id = ?", pasture.Id).
  134. Where("calving_id IN (?)", calvingIds).
  135. Where("is_live = ?", pasturePb.IsShow_Ok).
  136. Where("birth_at BETWEEN ? AND ?", startAt, endAt).
  137. Scan(&allLiveCow).Error; err != nil {
  138. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  139. }
  140. allCowCalving := len(eventCalvingList)
  141. if allCowCalving > 0 {
  142. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allLiveCow)/float64(allCowCalving))
  143. } else {
  144. res[pasture.Id] = "0"
  145. }
  146. }
  147. return res
  148. }
  149. // MultiparityDeathRate 经产牛接产死亡率
  150. func (e *Entry) MultiparityDeathRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  151. res := make(map[int64]string)
  152. for _, pasture := range pastureList {
  153. eventCalvingList := make([]*model.EventCalving, 0)
  154. if err := e.DB.Model(new(model.EventCalving)).
  155. Where("pasture_id = ?", pasture.Id).
  156. Where("status = ?", pasturePb.IsShow_Ok).
  157. Where("lact > ?", 0).
  158. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  159. Find(&eventCalvingList).Error; err != nil {
  160. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  161. }
  162. calvingIds := make([]int64, 0)
  163. for _, v := range eventCalvingList {
  164. calvingIds = append(calvingIds, v.Id)
  165. }
  166. var allDeathCow int64
  167. if err := e.DB.Model(new(model.CalvingCalf)).
  168. Select("count(*) as all_live_cow").
  169. Where("pasture_id = ?", pasture.Id).
  170. Where("calving_id IN (?)", calvingIds).
  171. Where("is_live = ?", pasturePb.IsShow_No).
  172. Where("birth_at BETWEEN ? AND ?", startAt, endAt).
  173. Scan(&allDeathCow).Error; err != nil {
  174. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  175. }
  176. allCowCalving := len(eventCalvingList)
  177. if allCowCalving > 0 {
  178. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allDeathCow)/float64(allCowCalving))
  179. } else {
  180. res[pasture.Id] = "0"
  181. }
  182. }
  183. return res
  184. }
  185. // AvgAgeFirstMate 平均首配日龄
  186. func (e *Entry) AvgAgeFirstMate(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  187. res := make(map[int64]string)
  188. for _, pasture := range pastureList {
  189. eventMatingList := make([]*model.EventMating, 0)
  190. if err := e.DB.Model(new(model.EventMating)).
  191. Select("day_age,cow_id").
  192. Where("pasture_id = ?", pasture.Id).
  193. Where("status = ?", pasturePb.IsShow_Ok).
  194. Where("lact = ?", 0).
  195. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  196. Find(&eventMatingList).Error; err != nil {
  197. zaplog.Error("FindCalvingInterval", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  198. }
  199. cowMatingDayAge := int32(0)
  200. for _, v := range eventMatingList {
  201. cowMatingDayAge += v.DayAge
  202. }
  203. if cowMatingDayAge > 0 {
  204. res[pasture.Id] = fmt.Sprintf("%d", cowMatingDayAge/int32(len(eventMatingList)))
  205. } else {
  206. res[pasture.Id] = "0"
  207. }
  208. }
  209. return res
  210. }
  211. // CowPregnantRate 后备牛怀孕比例
  212. func (e *Entry) CowPregnantRate(pastureList []*model.AppPastureList, caseName string) map[int64]string {
  213. res := make(map[int64]string)
  214. for _, pasture := range pastureList {
  215. cowList := make([]*model.Cow, 0)
  216. if err := e.DB.Model(new(model.Cow)).
  217. Where("pasture_id = ?", pasture.Id).
  218. Where("breed_status = ?", pasturePb.BreedStatus_Pregnant).
  219. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  220. Find(&cowList).Error; err != nil {
  221. zaplog.Error("YouthPregnantRate", zap.Any("pasture_id", pasture.Id), zap.Any("error", err))
  222. }
  223. allYouthCow, allMultiCow := 0, 0
  224. for _, cow := range cowList {
  225. if cow.Lact == 0 {
  226. allYouthCow += 1
  227. } else {
  228. allMultiCow += 1
  229. }
  230. }
  231. if caseName == "youth_pregnant_rate" {
  232. if allYouthCow > 0 {
  233. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allYouthCow)/float64(len(cowList)))
  234. } else {
  235. res[pasture.Id] = "0"
  236. }
  237. } else if caseName == "multiparty_pregnant_rate" {
  238. if allMultiCow > 0 {
  239. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allMultiCow)/float64(len(cowList)))
  240. } else {
  241. res[pasture.Id] = "0"
  242. }
  243. } else {
  244. res[pasture.Id] = "0"
  245. }
  246. }
  247. return res
  248. }
  249. // PregnantCheckRate 孕检有胎率
  250. func (e *Entry) PregnantCheckRate(pastureList []*model.AppPastureList, startAt, endAt int64, isLact bool, pregnantCheckName string) map[int64]string {
  251. res := make(map[int64]string)
  252. for _, pasture := range pastureList {
  253. eventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
  254. pref := e.DB.Model(new(model.EventPregnantCheck)).
  255. Where("pasture_id = ?", pasture.Id).
  256. Where("status = ?", pasturePb.IsShow_Ok).
  257. Where("pregnant_check_name = ?", pregnantCheckName).
  258. Where("reality_day BETWEEN ? AND ?", startAt, endAt)
  259. if isLact {
  260. pref = pref.Where("is_lact > ?", 0)
  261. } else {
  262. pref = pref.Where("is_lact = ?", 0)
  263. }
  264. if err := pref.Find(&eventPregnantCheckList).Error; err != nil {
  265. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  266. }
  267. isOK := 0
  268. for _, v := range eventPregnantCheckList {
  269. if v.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant {
  270. isOK += 1
  271. }
  272. }
  273. if len(eventPregnantCheckList) > 0 {
  274. res[pasture.Id] = fmt.Sprintf("%.2f", float64(isOK)/float64(len(eventPregnantCheckList)))
  275. } else {
  276. res[pasture.Id] = "0"
  277. }
  278. }
  279. return res
  280. }
  281. func (e *Entry) ForbiddenCowNumber(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  282. res := make(map[int64]string)
  283. for _, pasture := range pastureList {
  284. var count int64
  285. if err := e.DB.Model(new(model.EventForbiddenMating)).
  286. Where("pasture_id = ?", pasture.Id).
  287. Where("is_show = ?", pasturePb.IsShow_Ok).
  288. Where("forbidden_mating_at BETWEEN ? AND ?", startAt, endAt).
  289. Count(&count).Error; err != nil {
  290. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  291. }
  292. res[pasture.Id] = fmt.Sprintf("%d", count)
  293. }
  294. return res
  295. }