cow_indicators_breed.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. package crontab
  2. import (
  3. "fmt"
  4. "kpt-pasture/model"
  5. "kpt-pasture/util"
  6. "time"
  7. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  8. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  9. "go.uber.org/zap"
  10. )
  11. // FindCalvingNumber 产犊事件总数
  12. func (e *Entry) FindCalvingNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  13. res := make(map[int64]string)
  14. for _, pasture := range pastureList {
  15. var count int64
  16. if err := e.DB.Model(new(model.EventSale)).
  17. Where("pasture_id = ?", pasture.Id).
  18. Where("status = ?", pasturePb.IsShow_Ok).
  19. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  20. Count(&count).Error; err != nil {
  21. zaplog.Error("FindCalvingNumber", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  22. }
  23. res[pasture.Id] = fmt.Sprintf("%d", count)
  24. }
  25. return res
  26. }
  27. // LactationCow 泌乳牛头数 干奶牛头数 后备牛头数
  28. func (e *Entry) LactationCow(pastureList []*model.AppPastureList, milkKind pasturePb.CowMilk_Kind) map[int64]string {
  29. res := make(map[int64]string)
  30. for _, pasture := range pastureList {
  31. var count int64
  32. if err := e.DB.Model(new(model.Cow)).
  33. Where("pasture_id = ?", pasture.Id).
  34. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  35. Where("milk_kind = ?", milkKind).
  36. Where("sex = ?", pasturePb.Genders_Female).
  37. Count(&count).Error; err != nil {
  38. zaplog.Error("LactationCow", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  39. }
  40. res[pasture.Id] = fmt.Sprintf("%d", count)
  41. }
  42. return res
  43. }
  44. // FirstBornSurvivalRate 头胎接产成活率
  45. func (e *Entry) FirstBornSurvivalRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  46. res := make(map[int64]string)
  47. for _, pasture := range pastureList {
  48. eventCalvingList := make([]*model.EventCalving, 0)
  49. if err := e.DB.Model(new(model.EventCalving)).
  50. Where("pasture_id = ?", pasture.Id).
  51. Where("status = ?", pasturePb.IsShow_Ok).
  52. Where("lact = ?", 0).
  53. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  54. Find(&eventCalvingList).Error; err != nil {
  55. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  56. }
  57. calvingIds := make([]int64, 0)
  58. for _, v := range eventCalvingList {
  59. calvingIds = append(calvingIds, v.Id)
  60. }
  61. var allLiveCow int64
  62. if err := e.DB.Model(new(model.CalvingCalf)).
  63. Select("count(*) as all_live_cow").
  64. Where("pasture_id = ?", pasture.Id).
  65. Where("calving_id IN (?)", calvingIds).
  66. Where("is_live = ?", pasturePb.IsShow_Ok).
  67. Where("birth_at BETWEEN ? AND ?", startAt, endAt).
  68. Scan(&allLiveCow).Error; err != nil {
  69. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  70. }
  71. allCowCalving := len(eventCalvingList)
  72. if allCowCalving > 0 {
  73. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allLiveCow)/float64(allCowCalving))
  74. } else {
  75. res[pasture.Id] = "0"
  76. }
  77. }
  78. return res
  79. }
  80. // FirstBornDeathRate 头胎接产死亡率
  81. func (e *Entry) FirstBornDeathRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  82. res := make(map[int64]string)
  83. for _, pasture := range pastureList {
  84. eventCalvingList := make([]*model.EventCalving, 0)
  85. if err := e.DB.Model(new(model.EventCalving)).
  86. Where("pasture_id = ?", pasture.Id).
  87. Where("status = ?", pasturePb.IsShow_Ok).
  88. Where("lact = ?", 0).
  89. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  90. Find(&eventCalvingList).Error; err != nil {
  91. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  92. }
  93. calvingIds := make([]int64, 0)
  94. for _, v := range eventCalvingList {
  95. calvingIds = append(calvingIds, v.Id)
  96. }
  97. var allDeathCow int64
  98. if err := e.DB.Model(new(model.CalvingCalf)).
  99. Select("count(*) as all_live_cow").
  100. Where("pasture_id = ?", pasture.Id).
  101. Where("calving_id IN (?)", calvingIds).
  102. Where("is_live = ?", pasturePb.IsShow_No).
  103. Where("birth_at BETWEEN ? AND ?", startAt, endAt).
  104. Scan(&allDeathCow).Error; err != nil {
  105. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  106. }
  107. allCowCalving := len(eventCalvingList)
  108. if allCowCalving > 0 {
  109. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allDeathCow)/float64(allCowCalving))
  110. } else {
  111. res[pasture.Id] = "0"
  112. }
  113. }
  114. return res
  115. }
  116. // MultiparitySurvivalRate 经产牛接产成活率
  117. func (e *Entry) MultiparitySurvivalRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  118. res := make(map[int64]string)
  119. for _, pasture := range pastureList {
  120. eventCalvingList := make([]*model.EventCalving, 0)
  121. if err := e.DB.Model(new(model.EventCalving)).
  122. Where("pasture_id = ?", pasture.Id).
  123. Where("status = ?", pasturePb.IsShow_Ok).
  124. Where("lact > ?", 0).
  125. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  126. Find(&eventCalvingList).Error; err != nil {
  127. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  128. }
  129. calvingIds := make([]int64, 0)
  130. for _, v := range eventCalvingList {
  131. calvingIds = append(calvingIds, v.Id)
  132. }
  133. var allLiveCow int64
  134. if err := e.DB.Model(new(model.CalvingCalf)).
  135. Select("count(*) as all_live_cow").
  136. Where("pasture_id = ?", pasture.Id).
  137. Where("calving_id IN (?)", calvingIds).
  138. Where("is_live = ?", pasturePb.IsShow_Ok).
  139. Where("birth_at BETWEEN ? AND ?", startAt, endAt).
  140. Scan(&allLiveCow).Error; err != nil {
  141. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  142. }
  143. allCowCalving := len(eventCalvingList)
  144. if allCowCalving > 0 {
  145. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allLiveCow)/float64(allCowCalving))
  146. } else {
  147. res[pasture.Id] = "0"
  148. }
  149. }
  150. return res
  151. }
  152. // MultiparityDeathRate 经产牛接产死亡率
  153. func (e *Entry) MultiparityDeathRate(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  154. res := make(map[int64]string)
  155. for _, pasture := range pastureList {
  156. eventCalvingList := make([]*model.EventCalving, 0)
  157. if err := e.DB.Model(new(model.EventCalving)).
  158. Where("pasture_id = ?", pasture.Id).
  159. Where("status = ?", pasturePb.IsShow_Ok).
  160. Where("lact > ?", 0).
  161. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  162. Find(&eventCalvingList).Error; err != nil {
  163. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  164. }
  165. calvingIds := make([]int64, 0)
  166. for _, v := range eventCalvingList {
  167. calvingIds = append(calvingIds, v.Id)
  168. }
  169. var allDeathCow int64
  170. if err := e.DB.Model(new(model.CalvingCalf)).
  171. Select("count(*) as all_live_cow").
  172. Where("pasture_id = ?", pasture.Id).
  173. Where("calving_id IN (?)", calvingIds).
  174. Where("is_live = ?", pasturePb.IsShow_No).
  175. Where("birth_at BETWEEN ? AND ?", startAt, endAt).
  176. Scan(&allDeathCow).Error; err != nil {
  177. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  178. }
  179. allCowCalving := len(eventCalvingList)
  180. if allCowCalving > 0 {
  181. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allDeathCow)/float64(allCowCalving))
  182. } else {
  183. res[pasture.Id] = "0"
  184. }
  185. }
  186. return res
  187. }
  188. // AvgAgeFirstMate 平均首配日龄
  189. func (e *Entry) AvgAgeFirstMate(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  190. res := make(map[int64]string)
  191. for _, pasture := range pastureList {
  192. eventMatingList := make([]*model.EventMating, 0)
  193. if err := e.DB.Model(new(model.EventMating)).
  194. Select("day_age,cow_id").
  195. Where("pasture_id = ?", pasture.Id).
  196. Where("status = ?", pasturePb.IsShow_Ok).
  197. Where("lact = ?", 0).
  198. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  199. Find(&eventMatingList).Error; err != nil {
  200. zaplog.Error("FindCalvingInterval", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  201. }
  202. cowMatingDayAge := int32(0)
  203. for _, v := range eventMatingList {
  204. cowMatingDayAge += v.DayAge
  205. }
  206. if cowMatingDayAge > 0 {
  207. res[pasture.Id] = fmt.Sprintf("%d", cowMatingDayAge/int32(len(eventMatingList)))
  208. } else {
  209. res[pasture.Id] = "0"
  210. }
  211. }
  212. return res
  213. }
  214. // CowPregnantRate 后备牛怀孕比例
  215. func (e *Entry) CowPregnantRate(pastureList []*model.AppPastureList, caseName string) map[int64]string {
  216. res := make(map[int64]string)
  217. for _, pasture := range pastureList {
  218. cowList := make([]*model.Cow, 0)
  219. if err := e.DB.Model(new(model.Cow)).
  220. Where("pasture_id = ?", pasture.Id).
  221. Where("breed_status = ?", pasturePb.BreedStatus_Pregnant).
  222. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  223. Where("sex = ?", pasturePb.Genders_Female).
  224. Find(&cowList).Error; err != nil {
  225. zaplog.Error("YouthPregnantRate", zap.Any("pasture_id", pasture.Id), zap.Any("error", err))
  226. }
  227. allYouthCow, allMultiCow := 0, 0
  228. for _, cow := range cowList {
  229. if cow.Lact == 0 {
  230. allYouthCow += 1
  231. } else {
  232. allMultiCow += 1
  233. }
  234. }
  235. if caseName == "youth_pregnant_rate" {
  236. if allYouthCow > 0 {
  237. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allYouthCow)/float64(len(cowList)))
  238. } else {
  239. res[pasture.Id] = "0"
  240. }
  241. } else if caseName == "multiparty_pregnant_rate" {
  242. if allMultiCow > 0 {
  243. res[pasture.Id] = fmt.Sprintf("%.2f", float64(allMultiCow)/float64(len(cowList)))
  244. } else {
  245. res[pasture.Id] = "0"
  246. }
  247. } else {
  248. res[pasture.Id] = "0"
  249. }
  250. }
  251. return res
  252. }
  253. // PregnantCheckRate 孕检有胎率
  254. func (e *Entry) PregnantCheckRate(pastureList []*model.AppPastureList, startAt, endAt int64, isLact bool, pregnantCheckName string) map[int64]string {
  255. res := make(map[int64]string)
  256. for _, pasture := range pastureList {
  257. eventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
  258. pref := e.DB.Model(new(model.EventPregnantCheck)).
  259. Where("pasture_id = ?", pasture.Id).
  260. Where("status = ?", pasturePb.IsShow_Ok).
  261. Where("pregnant_check_name = ?", pregnantCheckName).
  262. Where("reality_day BETWEEN ? AND ?", startAt, endAt)
  263. if isLact {
  264. pref = pref.Where("is_lact > ?", 0)
  265. } else {
  266. pref = pref.Where("is_lact = ?", 0)
  267. }
  268. if err := pref.Find(&eventPregnantCheckList).Error; err != nil {
  269. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  270. }
  271. isOK := 0
  272. for _, v := range eventPregnantCheckList {
  273. if v.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant {
  274. isOK += 1
  275. }
  276. }
  277. if len(eventPregnantCheckList) > 0 {
  278. res[pasture.Id] = fmt.Sprintf("%.2f", float64(isOK)/float64(len(eventPregnantCheckList)))
  279. } else {
  280. res[pasture.Id] = "0"
  281. }
  282. }
  283. return res
  284. }
  285. // ForbiddenCowNumber 禁配牛数
  286. func (e *Entry) ForbiddenCowNumber(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  287. res := make(map[int64]string)
  288. for _, pasture := range pastureList {
  289. var count int64
  290. if err := e.DB.Model(new(model.EventForbiddenMating)).
  291. Where("pasture_id = ?", pasture.Id).
  292. Where("is_show = ?", pasturePb.IsShow_Ok).
  293. Where("forbidden_mating_at BETWEEN ? AND ?", startAt, endAt).
  294. Count(&count).Error; err != nil {
  295. zaplog.Error("FirstBornSurvivalRate", zap.Any("err", err))
  296. }
  297. res[pasture.Id] = fmt.Sprintf("%d", count)
  298. }
  299. return res
  300. }
  301. // AvgRegistrationDays 平均配准天数
  302. func (e *Entry) AvgRegistrationDays(pastureList []*model.AppPastureList) map[int64]string {
  303. res := make(map[int64]string)
  304. for _, pasture := range pastureList {
  305. cowList := make([]*model.Cow, 0)
  306. if err := e.DB.Model(new(model.Cow)).
  307. Where("pasture_id = ?", pasture.Id).
  308. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  309. Where("breed_status = ?", pasturePb.BreedStatus_Pregnant).
  310. Where("sex = ?", pasturePb.Genders_Female).
  311. Where("lact >= ?", 1).
  312. Find(&cowList).Error; err != nil {
  313. zaplog.Error("RegistrationDays", zap.Any("err", err))
  314. }
  315. regDays := int64(0)
  316. count := int64(0)
  317. for _, cow := range cowList {
  318. if cow.LastMatingAt > 0 && cow.LastCalvingAt > 0 {
  319. regDays += util.DaysBetween(cow.LastMatingAt, cow.LastCalvingAt)
  320. count++
  321. }
  322. }
  323. if count > 0 {
  324. res[pasture.Id] = fmt.Sprintf("%d", regDays/count)
  325. } else {
  326. res[pasture.Id] = "0"
  327. }
  328. }
  329. return res
  330. }
  331. // AvgPregnancyDays 平均怀孕天数
  332. func (e *Entry) AvgPregnancyDays(pastureList []*model.AppPastureList, startAt, endAt int64) map[int64]string {
  333. res := make(map[int64]string)
  334. for _, pasture := range pastureList {
  335. eventCalvingList := make([]*model.EventCalving, 0)
  336. if err := e.DB.Model(new(model.EventCalving)).
  337. Where("pasture_id = ?", pasture.Id).
  338. Where("status = ?", pasturePb.IsShow_Ok).
  339. Where("reality_day BETWEEN ? AND ?", startAt, endAt).
  340. Find(&eventCalvingList).Error; err != nil {
  341. zaplog.Error("FindCalvingInterval", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  342. }
  343. allPregnancyAge := int32(0)
  344. count := int32(0)
  345. for _, v := range eventCalvingList {
  346. if v.PregnancyAge > 0 {
  347. allPregnancyAge += v.PregnancyAge
  348. count++
  349. }
  350. }
  351. if count > 0 {
  352. res[pasture.Id] = fmt.Sprintf("%d", allPregnancyAge/count)
  353. } else {
  354. res[pasture.Id] = "0"
  355. }
  356. }
  357. return res
  358. }
  359. // AvgGestationalAge 平均受孕日龄
  360. func (e *Entry) AvgGestationalAge(pastureList []*model.AppPastureList) map[int64]string {
  361. res := make(map[int64]string)
  362. for _, pasture := range pastureList {
  363. eventMatingList := make([]*model.EventMating, 0)
  364. if err := e.DB.Model(new(model.EventMating)).
  365. Where("pasture_id = ?", pasture.Id).
  366. Where("status = ?", pasturePb.IsShow_Ok).
  367. Where("mating_result = ?", pasturePb.MatingResult_Pregnant).
  368. Where("lact = ?", 0).
  369. Find(&eventMatingList).Error; err != nil {
  370. zaplog.Error("FindGestationalAge", zap.Any("pasture_id", pasture.Id), zap.Any("err", err))
  371. }
  372. allDayAge := int32(0)
  373. count := int32(0)
  374. for _, v := range eventMatingList {
  375. if v.DayAge > 0 && v.RealityDay > 0 {
  376. allDayAge += v.DayAge
  377. count++
  378. }
  379. }
  380. if count > 0 {
  381. res[pasture.Id] = fmt.Sprintf("%d", allDayAge/count)
  382. } else {
  383. res[pasture.Id] = "0"
  384. }
  385. }
  386. return res
  387. }
  388. // MonthUnPregnancyRate 17-20月龄未孕比例
  389. func (e *Entry) MonthUnPregnancyRate(pastureList []*model.AppPastureList, month int32) map[int64]string {
  390. res := make(map[int64]string)
  391. for _, pasture := range pastureList {
  392. cowList := make([]*model.Cow, 0)
  393. if err := e.DB.Model(new(model.Cow)).
  394. Where("pasture_id = ?", pasture.Id).
  395. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  396. Where("sex = ?", pasturePb.Genders_Female).
  397. Find(&cowList).Error; err != nil {
  398. zaplog.Error("AvgEmptyDays", zap.Any("pastureId", pasture.Id), zap.Any("err", err))
  399. }
  400. nowTime := time.Now().Local()
  401. count := int32(0)
  402. for _, cow := range cowList {
  403. if cow.BirthAt <= 0 {
  404. continue
  405. }
  406. birthAt := time.Unix(cow.BirthAt, 0).Local()
  407. monthYear := util.GetMonths(birthAt, nowTime)
  408. if int32(monthYear) >= month {
  409. count++
  410. }
  411. }
  412. if count > 0 {
  413. res[pasture.Id] = fmt.Sprintf("%.2f", float64(count)/float64(len(cowList)))
  414. } else {
  415. res[pasture.Id] = "0"
  416. }
  417. }
  418. return res
  419. }
  420. // Multiparty150DaysUnPregnancyRate 成母牛150天未孕比例
  421. func (e *Entry) Multiparty150DaysUnPregnancyRate(pastureList []*model.AppPastureList, days int32) map[int64]string {
  422. res := make(map[int64]string)
  423. for _, pasture := range pastureList {
  424. cowList := make([]*model.Cow, 0)
  425. if err := e.DB.Model(new(model.Cow)).
  426. Where("pasture_id = ?", pasture.Id).
  427. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  428. Where("sex = ?", pasturePb.Genders_Female).
  429. Where("calving_age >= ?", days).
  430. Where("lact > ?", 0).
  431. Find(&cowList).Error; err != nil {
  432. zaplog.Error("Multiparty150DaysUnPregnancyRate", zap.Any("err", err), zap.Any("pastureId", pasture.Id))
  433. }
  434. count := int32(0)
  435. for _, cow := range cowList {
  436. if cow.BreedStatus != pasturePb.BreedStatus_Pregnant {
  437. count++
  438. }
  439. }
  440. if count > 0 {
  441. res[pasture.Id] = fmt.Sprintf("%.2f", float64(count)/float64(len(cowList)))
  442. } else {
  443. res[pasture.Id] = "0"
  444. }
  445. }
  446. return res
  447. }