cow_indicators_breed_more.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  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. // AdultCowsPregnancyRate 成牛受胎率
  12. func (e *Entry) AdultCowsPregnancyRate(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  13. res := make(map[int64]string)
  14. for _, pasture := range pastureList {
  15. var (
  16. pregnantCount int64 // 确认怀孕的
  17. realityBreedCount int64 // 参与配种的
  18. )
  19. if err := e.DB.Model(new(model.EventMating)).
  20. Where("pasture_id = ?", pasture.Id).
  21. Where("status = ?", pasturePb.IsShow_Ok).
  22. Where("mating_result = ?", pasturePb.MatingResult_Pregnant).
  23. Where("mating_result_at BETWEEN ? AND ?", startTime, endTime).
  24. Count(&pregnantCount).Error; err != nil {
  25. zaplog.Error("pregnantCount", zap.Any("err", err))
  26. }
  27. if err := e.DB.Model(new(model.EventMating)).
  28. Where("pasture_id = ?", pasture.Id).
  29. Where("status = ?", pasturePb.IsShow_Ok).
  30. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  31. Count(&realityBreedCount).Error; err != nil {
  32. zaplog.Error("realityBreedCount", zap.Any("err", err))
  33. }
  34. if realityBreedCount > 0 && pregnantCount > 0 {
  35. res[pasture.Id] = fmt.Sprintf("%.2f", float64(pregnantCount)/float64(realityBreedCount))
  36. } else {
  37. res[pasture.Id] = "0"
  38. }
  39. }
  40. return res
  41. }
  42. // LactPregnancyRate 母牛不同胎次受胎率
  43. func (e *Entry) LactPregnancyRate(pastureList []*model.AppPastureList, condition string, startTime, endTime int64) map[int64]string {
  44. res := make(map[int64]string)
  45. for _, pasture := range pastureList {
  46. var (
  47. pregnantCount int64 // 确认怀孕的
  48. realityBreedCount int64 // 参与配种的
  49. )
  50. if err := e.DB.Model(new(model.EventMating)).
  51. Where("pasture_id = ?", pasture.Id).
  52. Where("status = ?", pasturePb.IsShow_Ok).
  53. Where(condition).
  54. Where("mating_result = ?", pasturePb.MatingResult_Pregnant).
  55. Where("mating_result_at BETWEEN ? AND ?", startTime, endTime).
  56. Count(&pregnantCount).Error; err != nil {
  57. zaplog.Error("pregnantCount", zap.Any("err", err))
  58. }
  59. if err := e.DB.Model(new(model.EventMating)).
  60. Where("pasture_id = ?", pasture.Id).
  61. Where("status = ?", pasturePb.IsShow_Ok).
  62. Where(condition).
  63. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  64. Count(&realityBreedCount).Error; err != nil {
  65. zaplog.Error("realityBreedCount", zap.Any("err", err))
  66. }
  67. if realityBreedCount > 0 && pregnantCount > 0 {
  68. res[pasture.Id] = fmt.Sprintf("%.2f", float64(pregnantCount)/float64(realityBreedCount))
  69. } else {
  70. res[pasture.Id] = "0"
  71. }
  72. }
  73. return res
  74. }
  75. // MatingPregnancyRate 第1次配种受胎率/第2次配种受胎率
  76. func (e *Entry) MatingPregnancyRate(pastureList []*model.AppPastureList, kind string, startTime, endTime int64) map[int64]string {
  77. res := make(map[int64]string)
  78. for _, pasture := range pastureList {
  79. if kind != model.FirstMatingPregnancyRate && kind != model.SecondMatingPregnancyRate {
  80. res[pasture.Id] = "0"
  81. continue
  82. }
  83. var (
  84. pregnantCount int64 // 确认怀孕的
  85. realityBreedCount int64 // 参与配种的
  86. )
  87. pref1 := e.DB.Model(new(model.EventMating)).
  88. Where("pasture_id = ?", pasture.Id).
  89. Where("status = ?", pasturePb.IsShow_Ok).
  90. Where("mating_result = ?", pasturePb.MatingResult_Pregnant).
  91. Where("mating_result_at BETWEEN ? AND ?", startTime, endTime)
  92. if kind == model.FirstMatingPregnancyRate {
  93. pref1 = pref1.Where("remating_at = ?", 0)
  94. }
  95. if kind == model.SecondMatingPregnancyRate {
  96. pref1 = pref1.Where("remating_at > ?", 0)
  97. }
  98. if err := pref1.Count(&pregnantCount).Error; err != nil {
  99. zaplog.Error("pregnantCount", zap.Any("err", err))
  100. }
  101. pref2 := e.DB.Model(new(model.EventMating)).
  102. Where("pasture_id = ?", pasture.Id).
  103. Where("status = ?", pasturePb.IsShow_Ok).
  104. Where("reality_day BETWEEN ? AND ?", startTime, endTime)
  105. if kind == model.FirstMatingPregnancyRate {
  106. pref2 = pref2.Where("remating_at = ?", 0)
  107. }
  108. if kind == model.SecondMatingPregnancyRate {
  109. pref2 = pref2.Where("remating_at > ?", 0)
  110. }
  111. if err := pref2.Count(&realityBreedCount).Error; err != nil {
  112. zaplog.Error("realityBreedCount", zap.Any("err", err))
  113. }
  114. if realityBreedCount > 0 && pregnantCount > 0 {
  115. res[pasture.Id] = fmt.Sprintf("%.2f", float64(pregnantCount)/float64(realityBreedCount))
  116. } else {
  117. res[pasture.Id] = "0"
  118. }
  119. }
  120. return res
  121. }
  122. // Day75DayMatingRate 75天配种率(在群)
  123. func (e *Entry) Day75DayMatingRate(pastureList []*model.AppPastureList) map[int64]string {
  124. res := make(map[int64]string)
  125. for _, pasture := range pastureList {
  126. cowList := make([]*model.Cow, 0)
  127. if err := e.DB.Model(new(model.Cow)).
  128. Where("pasture_id = ?", pasture.Id).
  129. Where("calving_age >= ?", 75).
  130. Find(&cowList).Error; err != nil {
  131. zaplog.Error("matingCount", zap.Any("err", err))
  132. }
  133. cowIds := make([]int64, 0)
  134. for _, cow := range cowList {
  135. cowIds = append(cowIds, cow.Id)
  136. }
  137. var matingCowCount int64
  138. if err := e.DB.Model(new(model.EventMating)).
  139. Where("pasture_id = ?", pasture.Id).
  140. Where("status = ?", pasturePb.IsShow_Ok).
  141. Where("cow_id IN ?", cowIds).
  142. Where("calving_age < ?", 75).
  143. Count(&matingCowCount).Error; err != nil {
  144. zaplog.Error("matingCount", zap.Any("err", err))
  145. }
  146. if len(cowIds) > 0 && matingCowCount > 0 {
  147. res[pasture.Id] = fmt.Sprintf("%.2f", float64(matingCowCount)/float64(len(cowIds)))
  148. } else {
  149. res[pasture.Id] = "0"
  150. }
  151. }
  152. return res
  153. }
  154. // Day75MonthMatingRate 75天配种率(月度)
  155. func (e *Entry) Day75MonthMatingRate(pastureList []*model.AppPastureList, indicatorsId int64) map[int64]string {
  156. res := make(map[int64]string)
  157. nowTime := time.Now().Local()
  158. monthStartAt, monthEndAt := util.GetMonthStartAndEndTimestamp()
  159. nowTimeFormat := nowTime.Format(model.LayoutDate2)
  160. monthStartAtFormat := time.Unix(monthStartAt, 0).Local().Format(model.LayoutDate2)
  161. monthEndAtFormat := time.Unix(monthEndAt, 0).Local().Format(model.LayoutDate2)
  162. if nowTimeFormat != monthStartAtFormat || nowTimeFormat != monthEndAtFormat {
  163. for _, pasture := range pastureList {
  164. res[pasture.Id] = "0"
  165. }
  166. return res
  167. }
  168. if nowTimeFormat == monthStartAtFormat {
  169. for _, pasture := range pastureList {
  170. cowList := make([]*model.Cow, 0)
  171. if err := e.DB.Model(new(model.Cow)).Where("pasture_id = ?", pasture.Id).
  172. Where("calving_age < ?", 75).
  173. Where("sex = ?", pasturePb.Genders_Female).
  174. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  175. Find(&cowList).Error; err != nil {
  176. zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
  177. }
  178. if len(cowList) > 0 {
  179. newIndicatorsCowList := model.NewIndicatorsCowList(pasture.Id, indicatorsId, nowTimeFormat, cowList)
  180. if err := e.DB.Model(new(model.IndicatorsCow)).
  181. Create(newIndicatorsCowList).Error; err != nil {
  182. zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
  183. }
  184. }
  185. res[pasture.Id] = "0"
  186. }
  187. return res
  188. }
  189. if nowTimeFormat == monthEndAtFormat {
  190. for _, pasture := range pastureList {
  191. indicatorsCowList := make([]*model.IndicatorsCow, 0)
  192. if err := e.DB.Model(new(model.IndicatorsCow)).
  193. Where("pasture_id = ?", pasture.Id).
  194. Where("indicators_id = ?", indicatorsId).
  195. Where("date_time = ?", monthStartAtFormat).
  196. Find(&indicatorsCowList).Error; err != nil {
  197. zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
  198. }
  199. cowIds := make([]int64, 0)
  200. for _, indicatorsCow := range indicatorsCowList {
  201. cowIds = append(cowIds, indicatorsCow.CowId)
  202. }
  203. var historyCowCount int64
  204. if err := e.DB.Table(fmt.Sprintf("%s as cow as a", new(model.Cow).TableName())).
  205. Joins("LEFT JOIN %s as b on a.id = b.cow_id", new(model.EventMating).TableName()).
  206. Where("a.pasture_id = ?", pasture.Id).
  207. Where("a.id IN ?", cowIds).
  208. Where("b.status = ?", pasturePb.IsShow_Ok).
  209. Where("b.calving_age < ?", 75).
  210. Where("a.calving_age >= ?", 75).
  211. Count(&historyCowCount).Error; err != nil {
  212. zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
  213. }
  214. var currentCowCount int64
  215. if err := e.DB.Model(new(model.Cow)).
  216. Where("pasture_id = ?", pasture.Id).
  217. Where("calving_age >= ?", 75).
  218. Where("sex = ?", pasturePb.Genders_Female).
  219. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  220. Count(&currentCowCount).Error; err != nil {
  221. zaplog.Error("Day75MonthMatingRate", zap.Any("err", err))
  222. }
  223. if currentCowCount > 0 && historyCowCount > 0 {
  224. res[pasture.Id] = fmt.Sprintf("%.2f", float64(historyCowCount)/float64(currentCowCount))
  225. } else {
  226. res[pasture.Id] = "0"
  227. }
  228. }
  229. }
  230. return res
  231. }
  232. // AvgAdultCowEmptyNumber 成母牛平均空怀天数
  233. func (e *Entry) AvgAdultCowEmptyNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
  234. res := make(map[int64]string)
  235. for _, pasture := range pastureList {
  236. var v = struct {
  237. EmptyDays int64
  238. CowCount int64
  239. }{
  240. EmptyDays: 0,
  241. CowCount: 0,
  242. }
  243. if err := e.DB.Model(new(model.Cow)).
  244. Select(`
  245. SUM(
  246. CASE
  247. -- 未孕牛只:空怀天数 = 当前日期 - 产犊日期
  248. WHEN is_pregnant = 2 AND last_calving_at > 0 THEN
  249. DATEDIFF(
  250. FROM_UNIXTIME(UNIX_TIMESTAMP()),
  251. FROM_UNIXTIME(last_calving_at)
  252. )
  253. -- 已孕牛只:空怀天数 = 配种结果为怀孕的配种日期 - 产犊日期
  254. WHEN is_pregnant = 1 AND last_mating_at > 0 AND last_calving_at > 0 THEN
  255. DATEDIFF(
  256. FROM_UNIXTIME(last_mating_at),
  257. FROM_UNIXTIME(last_calving_at)
  258. )
  259. ELSE 0
  260. END
  261. ) AS empty_days,count(*) AS cow_count`).
  262. Where("pasture_id = ?", pasture.Id).
  263. Where("sex = ?", pasturePb.Genders_Female).
  264. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  265. Where("lact >= ?", 1).
  266. First(&v).
  267. Error; err != nil {
  268. zaplog.Error("AvgAdultCowEmptyNumber", zap.Any("err", err))
  269. }
  270. if v.CowCount > 0 && v.EmptyDays > 0 {
  271. res[pasture.Id] = fmt.Sprintf("%d", v.EmptyDays/v.CowCount)
  272. } else {
  273. res[pasture.Id] = "0"
  274. }
  275. }
  276. return res
  277. }
  278. // CowPregnantCheckOkRate 牛孕检怀孕比
  279. func (e *Entry) CowPregnantCheckOkRate(pastureList []*model.AppPastureList, condition string, startTime, endTime int64) map[int64]string {
  280. res := make(map[int64]string)
  281. for _, pasture := range pastureList {
  282. var pregnantCheckOkCount int64
  283. eventPregnantCheckList := make([]*model.EventPregnantCheck, 0)
  284. if err := e.DB.Model(new(model.EventPregnantCheck)).
  285. Where("pasture_id = ?", pasture.Id).
  286. Where("status = ?", pasturePb.IsShow_Ok).
  287. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  288. Where(condition).
  289. Find(&eventPregnantCheckList).Error; err != nil {
  290. zaplog.Error("CowPregnantCheckOkRate", zap.Any("err", err))
  291. }
  292. for _, eventPregnantCheck := range eventPregnantCheckList {
  293. if eventPregnantCheck.PregnantCheckResult != pasturePb.PregnantCheckResult_Pregnant {
  294. continue
  295. }
  296. pregnantCheckOkCount++
  297. }
  298. if pregnantCheckOkCount > 0 && len(eventPregnantCheckList) > 0 {
  299. res[pasture.Id] = fmt.Sprintf("%.2f", float64(pregnantCheckOkCount)/float64(len(eventPregnantCheckList)))
  300. } else {
  301. res[pasture.Id] = "0"
  302. }
  303. }
  304. return res
  305. }
  306. // CowForbiddenMatingRate 禁配占比
  307. func (e *Entry) CowForbiddenMatingRate(pastureList []*model.AppPastureList, condition string, startTime, endTime int64) map[int64]string {
  308. res := make(map[int64]string)
  309. for _, pasture := range pastureList {
  310. var (
  311. forbiddenMatingCount int64
  312. cowCount int64
  313. )
  314. if err := e.DB.Model(new(model.Cow)).
  315. Where("pasture_id = ?", pasture.Id).
  316. Where("sex = ?", pasturePb.Genders_Female).
  317. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  318. Where(condition).
  319. Where("lact >= ?", 1).
  320. Count(&cowCount).Error; err != nil {
  321. zaplog.Error("AdultCowForbiddenMatingRate", zap.Any("err", err))
  322. }
  323. if cowCount > 0 {
  324. if err := e.DB.Model(new(model.EventForbiddenMating)).
  325. Where("pasture_id = ?", pasture.Id).
  326. Where("status = ?", pasturePb.IsShow_Ok).
  327. Where("lact >= ?", 1).
  328. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  329. Count(&forbiddenMatingCount).Error; err != nil {
  330. zaplog.Error("AdultCowForbiddenMatingRate", zap.Any("err", err))
  331. }
  332. if forbiddenMatingCount > 0 {
  333. res[pasture.Id] = fmt.Sprintf("%.2f", float64(forbiddenMatingCount)/float64(cowCount))
  334. } else {
  335. res[pasture.Id] = "0"
  336. }
  337. } else {
  338. res[pasture.Id] = "0"
  339. }
  340. }
  341. return res
  342. }
  343. // CowForbiddenMatingNumber 禁配牛头数
  344. func (e *Entry) CowForbiddenMatingNumber(pastureList []*model.AppPastureList, condition string, startTime, endTime int64) map[int64]string {
  345. res := make(map[int64]string)
  346. for _, pasture := range pastureList {
  347. var forbiddenMatingCount int64
  348. if err := e.DB.Model(new(model.EventForbiddenMating)).
  349. Where("pasture_id = ?", pasture.Id).
  350. Where("status = ?", pasturePb.IsShow_Ok).
  351. Where(condition).
  352. Where("reality_day BETWEEN ? AND ?", startTime, endTime).
  353. Count(&forbiddenMatingCount).Error; err != nil {
  354. zaplog.Error("AdultCowForbiddenMatingRate", zap.Any("err", err))
  355. }
  356. if forbiddenMatingCount > 0 {
  357. res[pasture.Id] = fmt.Sprintf("%d", forbiddenMatingCount)
  358. } else {
  359. res[pasture.Id] = "0"
  360. }
  361. }
  362. return res
  363. }